L'incorporation d'un Explorateur de Fichiers instance dans une application Windows Forms forme
Mon (C#, .NET 3.5) de l'application génère des fichiers et, en plus de soulever des événements qui peuvent être pris et a réagi à, je veux afficher le dossier cible pour l'utilisateur dans un formulaire. La liste de fichiers est affichée à l'intérieur de la même forme que d'autres informations.
Je suis en utilisant une instance de la WebBrowser
de contrôle (System.Windows.Forms.WebBrowser
), puis en naviguant dans ce dossier. Cela montre que certains d'affichage par défaut de la fenêtre de l'explorateur, avec le fichier résumé panneau sur la gauche et les fichiers dans les "Tuiles" (gros icône et le texte).
Par exemple,
wb.Navigate(@"c:\path\to\folder\");
Je voudrais supprimer le groupe et pour afficher la liste des fichiers dans la vue Détails. L'utilisateur peut accéder à cette via un clic droit, le menu contextuel, mais j'aimerais qu'il vienne automatiquement.
Je préfère ne pas avoir à construire mon propre TreeView, DataGridView, ou que ce soit; le contrôle WebBrowser fait toutes les mise à jour et re-trier et autres joyeusetés 'libre'.
Est-il un meilleur moyen? Un autre contrôle à utiliser ou à certains des arguments supplémentaires à transmettre au contrôle?
Et si je pouvais les événements d'interruption (par exemple, les fichiers sélectionnés/renommé/double-clic, etc.) alors tout le mieux!
OriginalL'auteur Unsliced | 2009-02-12
Vous devez vous connecter pour publier un commentaire.
Afin de gérer les renommer, les supprimer et de rendre les autres éléments de personnalisation, vous devez écrire votre propre explorateur de fichiers. Contrôle WebBrowser n'est pas adapté à vos besoins. C'est juste un wrapper sur le composant ActiveX.
Vous devriez vérifier cette codeproject article. Il contient une implémentation de l'explorateur de fichiers. Il y a quelques autres échantillons de navigateur de fichier:
un
deux
OriginalL'auteur
AVERTISSEMENT: Long post avec beaucoup de code.
Lorsque vous naviguez sur le contrôle de navigateur web à un dossier du système de fichiers, le contrôle de navigateur web héberge un shell fenêtre, qui à son tour les hôtes de l'explorateur d'affichage de liste. En fait, c'est exactement la même chose que l'Explorateur de processus ainsi que les boîtes de dialogue fichier et Internet Explorer. Cette fenêtre shell n'est pas un contrôle, donc il n'y a pas de méthodes qui peuvent être appelées sur elle ou d'événements qui peuvent être souscrites, mais il peut recevoir des messages de windows et il peut être sous-classé.
Il s'avère que la partie de votre question de paramétrage de l'affichage des Détails automatiquement est en fait assez facile. Dans votre navigateur web du contrôle Navigué cas il suffit de trouver la poignée de la coquille vue de la fenêtre et lui envoyer un message WM_COMMAND avec un shell particulier constante (SHVIEW_REPORT). C'est un sans-papiers de commande, mais il est pris en charge sur toutes les plateformes Windows, y compris Windows 2008 et sera certainement le cas sur Windows 7. Un peu de code à ajouter à votre navigateur web formulaire illustre cela:
Chaque fois que le navigateur web accède à une nouvelle fenêtre (y compris lorsqu'un dossier est ouvert dans la vue de l'explorateur) un nouveau shell fenêtre d'affichage est créé de sorte que le message doit être envoyé à la nouvelle fenêtre dans chaque Navigué événement.
Pour la deuxième partie de votre question que vous aimeriez recevoir des événements à partir de l'explorateur d'affichage de liste. C'est un peu plus difficile que la première partie. Pour ce faire, vous devez sous-classe de la vue de liste de la fenêtre, puis de surveiller les messages windows pour celles qui vous intéressent (comme WM_LBUTTONDBLCLK). Pour la sous-classe d'une fenêtre, vous devez créer votre propre classe dérivée de la classe NativeWindow et affectez-le à la poignée de la fenêtre que vous devez surveiller. Vous pouvez ensuite remplacer la procédure de Fenêtre et de gérer les différents messages que vous le souhaitez. Ci-dessous est un exemple de création d'un double-cliquez sur l'événement - c'est relativement simple, mais pour obtenir de plus amples accès à l'explorateur affichage de la liste peut impliquer beaucoup plus de travail que vous êtes prêt à le faire.
Ajouter à votre formulaire:
et ces deux lignes à la Navigué gestionnaire d'événement (à droite après le SendMessage):
Puis ajouter les classes suivantes:
Cela devrait vous donner une idée de ce que vous devez faire. Si vous voulez plus d'assez simple d'événements vous pouvez chercher une alternative de contrôle, mais d'après ce que j'ai vu dans le libre et à faible coût zones, il existe des assez décent, mais ils ont tous quelques bizarreries et ne donnera pas une transparente explorer l'expérience.
Rappelez-vous ce code a été mis en place assez rapidement, sans erreur de manipulation, de commentaires ou d'ignorer plusieurs problèmes tels que de multiples éléments sélectionnés, afin de l'utiliser comme ligne directrice et à vos propres risques.
Si cela fonctionne pour vous c'est génial. Si ce n'est pas pour une utilisation personnelle, je vous recommandons fortement d'utiliser le LogicNP solution proposée par uzbones. Le code d'un élément du projet est un vaillant effort, mais il est loin d'être robuste pour dire le moins.
OriginalL'auteur
LogicNP Logiciel dispose de deux contrôles (FileView et ShComboBox) que faire de ce que vous cherchez:
http://www.ssware.com/fldrview.htm
Vous pouvez télécharger une version d'essai à partir de leur page, cependant, il est ~130$ pour la licence.
OriginalL'auteur
J'ai écrit une bibliothèque qui peut être en mesure de vous aider. Vous pouvez le trouver à: http://gong-shell.sourceforge.net/
Le contrôle que vous cherchez est la ShellView. Il y a des tutoriels sur la meilleure méthode pour créer un simple clone de Windows Explorer en seulement quelques lignes.
Note .NET 4.0 utilisateurs: Gong-shell est actuellement cassé pour la version 4.0. Le cadre introduit des changements dans l'Interopérabilité et il va construire un peu fine mais à cause de différents problèmes lors de l'interfaçage avec shell32 (notamment la shellicon api, conduisant à une non géré déréférencement de pointeur null).
OriginalL'auteur
Découvrez cet article ici, il montre comment faire .NET et WinForms. Cette façon de faire donne le plein contrôle sur ce que l'utilisateur voit.
Je l'ai utilisé dans un de mes demandes et il fonctionne vraiment bien. Vous pouvez afficher l'icône/détails/affichage de la liste et il s'arrête à l'utilisateur de se déplacer vers d'autres répertoires (ce qui est souvent le problème de l'affichage du standard de fichier/répertoire des boîtes de dialogue.
Je l'utilise pour afficher l'écran comme celui ci-dessous ci-dessous http://img7.imageshack.us/img7/7647/screenshotbaf.png:
OriginalL'auteur
Vous pouvez regarder le ExplorerBrowser objet.
Voir http://blogs.msdn.com/ieinternals/archive/2009/12/30/Windows-7-Web-Browser-Control-will-not-browse-file-system.aspx pour plus de détails.
OriginalL'auteur
Si vous êtes heureux d'être Windows Vista, et l'enveloppant d'un COM de contrôle, IExplorerBrowser pourrait être acceptable pour vous besoins.
Ce Projet Du Code, de l'article montre son utilisation au sein d'une MFC programme, mais au moins une autre personne semble avoir réussi à le faire en C# après quelques efforts.
La nouvelle API expose beaucoup plus de possibilités de programmation que de simplement intercepter les messages, mais il est (évidemment) inutile pour les anciennes plates-formes.
OriginalL'auteur
Si vous souhaitez ouvrir une autre fenêtre pour afficher le dossier cible du contenu que vous pouvez utiliser le Système.De Windows.Les formulaires.OpenFileDialog, ou SaveFileDialog, ou hériter de FileDialog et de l'étendre.
Pour permettre à l'utilisateur de sélectionner un dossier, vous pouvez utiliser FolderBrowserDialog, mais en tant qu'utilisateur, je n'aime pas le contrôle.
Cela aide ou vous devez absolument intégrer un contrôle dans un formulaire?
Asaf
Je n'ai de début et de fin par se demander si c' est pour être dans la même forme. À partir de la question, il n'est pas clair pour moi si il est intégré dans un formulaire parce que il est mis en œuvre avec un WebBrowser, ou parce que le fichier de vue est à côté de quelque chose d'autre. Il n'y a pas de droite vers l'avant de façon à intégrer une boîte de dialogue dans un formulaire.
Il fait plutôt être dans la même forme que l'information doit être affichée à côté d'autres progrès et les mises à jour de statut. Il est surprenant de constater que nous avons ouvrir/enregistrer un fichier/créer des dossiers boîte de dialogue, mais aucun explicitement à parcourir ...
OriginalL'auteur