2008-12-01 12 views
8

¿Es posible incrustar la vista del navegador de archivos/carpetas de Windows Explorer en una ventana WPF o WinForms?Alojamiento de Windows Shell Explorer en mi aplicación WPF

Básicamente quiero alojar el navegador de archivos/carpetas como parte de la ventana de mi aplicación. No quiero volver a implementar lo que proporciona el shell, especialmente las extensiones de shell como TortoiseSVN.

Respuesta

5

Hasta donde yo sé, no hay ningún control de buscador de archivos/carpetas fuera de la caja en Windows Forms ni WPF.
Sin embargo, hay controles comerciales de terceros que ofrecen una interfaz similar a Windows Explorer para explorar archivos y carpetas en el disco. Echar un vistazo a estos productos de LogicNP:

Como alternativa, puede acoger la Windows Forms control WebBrowser en WPF y lo utilizan para navegar por el sistema de archivos, ya que está integrado con el shell de Windows.
En XAML se podría hacer algo como esto:

<Window x:Class="Samples.FilesystemBrowser" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
    Title="Filesystem Browser"> 
    <StackPanel> 
     <WindowsFormsHost> 
      <wf:WebBrowser Url="C:\" /> 
     </WindowsFormsHost> 
    </StackPanel> 
</Window> 

Tenga en cuenta, que con .NET 3.5 SP1 Microsoft agregó un nativa WPF control WebBrowser, por lo que puede, opcionalmente, utilice en su lugar:

<Window x:Class="Samples.FilesystemBrowser" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Filesystem Browser"> 
    <StackPanel> 
     <WebBrowser Source="C:\" /> 
    </StackPanel> 
</Window> 
+0

Gracias, pero ¿Cómo podría saber si un archivo o carpeta está seleccionada? –

1

El enfoque en mi respuesta no es uno que recomiendo necesariamente, ya que es básicamente un gran truco. Sin embargo, es posible "alojar" casi cualquier aplicación de Windows dentro de otra. Advertencias:

  • Este es un gran Hack grasa
  • No estoy seguro del todo lo bien que juega con las diversas características de seguridad que son, por ejemplo, en Vista
  • Trabajará con API de bajo nivel y, a veces, poco documentadas todo el tiempo, y haciendo cosas que no son lo que los diseñadores originales anticiparon.
  • no sé las diversas APIs suficientemente bien como para decir exactamente qué hacer, por lo que este es un esquema muy áspera ...

El enfoque básico sería:

  1. Inicie un nuevo proceso explorer.exe
  2. Obtenga su HWnd
  3. Usando p/invocar llamadas en varias API de Windows (principalmente shell32.dll), vuelva a criarla en NativeWindow o UserControl usted mismo.
  4. Puede reemplazar su manejador de mensajes WndProc por el suyo, subclassing para inyectar sus propios comportamientos específicos de la aplicación. (C++ example; stackoverflow question WRT llamando al viejo/predeterminado WndProc; googling producirá muchas respuestas. He hecho esto antes en C# y (ick) VBA) Esto le permitirá reemplazar varios comportamientos de UI con los suyos, albiet en un momento nivel bajo. (Depende de cómo exactamente se implemente el explorador: los elementos de nivel más alto, como los clics del menú, pueden obtener su propio mensaje y, por lo tanto, ser más fáciles de manejar, pero en otros aspectos del comportamiento del explorador es posible que solo reciba los mensajes crudos del mouse.)

Querrá saber Spy++ para saber qué mensajes ocurren.

Sí, esto es una gran manera de construir una gran cantidad de código muy fea y frágil, pero es (a) a veces la única manera de que las cosas funcionen bien; y (b) grande para el aprendizaje de lo que está pasando bajo el capó de Windows.Forms/MFC/etc

2

He escrito una biblioteca de código abierto para incrustar el Explorador de Windows en aplicaciones .NET. Puede echar un vistazo a http://gong-shell.sourceforge.net/

Expone los controles de WinForms, así como también proporciona una interfaz de idioma .NET para el shell de Windows. Está licenciado bajo la licencia GPL, por lo que su uso en una aplicación con licencia similar es gratuito, sin embargo, si desea utilizarlo en una aplicación comercial, envíenme un correo electrónico y estoy seguro de que podemos solucionarlo.

+0

Por cierto, por favor hágamelo saber cómo te va con él, he tenido muy poca información hasta ahora, sería bueno saber si funciona para usted o de cualquier problema que está teniendo. – Grokys

6

Shell de Windows Vista introdujo un nuevo control que implementa la interfaz IExplorerBrowser; este es el método recomendado para alojar una vista de sistema de archivos de Windows Shell dentro de su aplicación. Los desarrolladores que crean aplicaciones utilizando .NET pueden usar la versión empaquetada del control ExplorerBrowser disponible en el API CodePack de Windows para .NET.

Tenga en cuenta que esta interfaz sólo está disponible en Windows Vista y versiones posteriores. Si su aplicación necesita ejecutarse en versiones anteriores de Windows, deberá recurrir a la implementación anterior de WebOC en esas plataformas.

http://msdn.microsoft.com/en-us/library/bb761909(VS.85).aspx http://code.msdn.microsoft.com/WindowsAPICodePack

Esto se recomienda más que aloja el control navegador web debido a un problema Win7 se describe aquí: http://blogs.msdn.com/ieinternals/archive/2009/12/30/Windows-7-Web-Browser-Control-will-not-browse-file-system.aspx

0

que creo el paquete de código de Windows API para .NET publicado en 2009 contiene componentes de Windows Forms para esto. Mire las respuestas a la pregunta: Use Windows Explorer in .NET code?.

Cuestiones relacionadas