Comment configurer un OpenFileDialog pour sélectionner des dossiers?
Dans VS .NET, lorsque vous sélectionnez un dossier pour un projet, une boîte de dialogue qui ressemble à un OpenFileDialog ou SaveFileDialog est affiché, mais est configuré pour accepter seulement les dossiers. Depuis que j'ai vu ce que j'ai voulu savoir comment c'est fait. Je suis conscient de la FolderBrowserDialog, mais je n'ai jamais vraiment aimé cette boîte de dialogue. Il commence à trop petite et ne me permet pas de prendre avantage de pouvoir tapez un chemin d'accès.
Je suis presque certain maintenant, il n'y a pas moyen de le faire partir .NET, mais je suis tout aussi curieux de voir comment vous le faire à partir de code non managé ainsi. Court de complètement de réimplanter la boîte de dialogue à partir de zéro, comment voulez-vous modifier la boîte de dialogue d'avoir ce comportement?
Je tiens également à souligner que je suis conscient de la FolderBrowserDialog mais parfois, je n'aime pas l'utiliser, en plus d'être vraiment curieux de savoir comment configurer une boîte de dialogue de cette manière. Me disant simplement utiliser le FolderBrowserDialog m'aide à maintenir une INTERFACE cohérente de l'expérience, mais ne pas satisfaire ma curiosité, donc il ne compte pas comme une réponse.
Ce n'est pas un Vista spécifiques chose; j'ai été voir cette boîte de dialogue depuis VS .NET 2003, de sorte qu'il est faisable en Win2k et WinXP. C'est moins d'un "je veux connaître la bonne façon de le faire" à la question et plus d'un "j'ai été curieux au sujet de ce depuis que j'ai voulu le faire en VS 2003" question. Je comprends que Vista boîte de dialogue de fichier a une option pour le faire, mais elle fonctionne sous XP donc je sais qu'ils ont fait quelque chose pour le faire fonctionner. Vista-des réponses précises ne sont pas des réponses, parce que Vista n'existe pas dans la question de contexte.
Mise à jour: je suis en acceptant Scott Wisniewski réponse, car il est livré avec un échantillon de travail, mais je pense que Serge a le mérite de pointage de la boîte de dialogue de personnalisation (qui est certes désagréable de .NET, mais il ne travail) et la Marque de Rançon pour comprendre que MME roulé probablement un dialogue personnalisée pour cette tâche.
- juste une solution simple à partir de codeproject codeproject.com/Articles/44914/... [La clé pour obtenir OpenFileDialog pour sélectionner les deux fichiers et dossiers est de définir la ValidateNames et CheckFileExists propriétés à faux (boîte de dialogue.ValidateNames = false; boîte de dialogue.CheckFileExists = false) et de définir le nom du fichier à certains mot-clé spécial pour s'assurer que les dossiers sélectionnés (boîte de dialogue.FileName = "Sélection Du Dossier";).]
- Présenter cela comme une réponse, il a fait le travail pour mon projet.
- est
dialog.FileName = "Folder Selection"
censé êtredialog.FileName = "Folder Selection."
avec la période de fin? de toute façon je ne peux pas le faire fonctionner dans powershell sur le deuxième clic sur "Ouvrir" de toute façon. Il continue à dire que le fichier n'est pas trouvé, même si CheckFileExists est soi-disant faux - nvm, dans powershell réglage
dialog.CheckFileExists = 0
au lieu de false résolu mon problème - Avez-vous essayé le Ookii boîtes de dialogue pour WPF?
Vous devez vous connecter pour publier un commentaire.
J'ai une boîte de dialogue que j'ai écrit appelé OpenFileOrFolder boîte de dialogue qui vous permet d'ouvrir un dossier ou un fichier.
Si vous réglez son AcceptFiles de la valeur à false, alors il ne fonctionne que dans d'accepter le mode dossier.
Vous pouvez télécharger la source de GitHub ici
Il est l'API de Windows Pack de Code. Il a beaucoup de shell choses liées, y compris le
CommonOpenFileDialog
la classe (dans leMicrosoft.WindowsAPICodePack.Dialogs
espace de noms). C'est la solution parfaite - l'habituelle boîte de dialogue ouvrir avec seulement des dossiers.Voici un exemple de comment l'utiliser:
Malheureusement, Microsoft n'est plus livré ce package, mais plusieurs personnes ont officieusement téléchargé les fichiers binaires à NuGet. Un exemple peut être trouvé ici. Ce package n'est qu'une coquille spécifique des choses. Si vous avez besoin d'elle, de la même utilisateur dispose de plusieurs autres paquets qui offrent plus de fonctionnalités présent dans le package d'origine.
Vous pouvez utiliser FolderBrowserDialogEx -
une ré-utilisable dérivés de l'intégré dans FolderBrowserDialog. Celui-ci vous permet de taper dans un chemin, même un chemin d'accès UNC. Vous pouvez également rechercher des ordinateurs ou des imprimantes avec elle. Fonctionne exactement comme le haut-LOG, mais ... mieux.
(EDIT: je devrais avoir souligné que ce dialogue peut être configurée pour sélectionner des fichiers ou des dossiers. )
L'intégralité du code Source (un bref C# module). Gratuit. MS-Public license.
Code à utiliser:
La Ookii.Les boîtes de dialogue paquet contient un gérés wrapper autour de la nouvelle (Vista-style) dossier de dialogue du navigateur. Elle a également dégrade gracieusement sur les anciens systèmes d'exploitation.
OpenFileDialog
-dossier de style de dialogue.Mieux utiliser la FolderBrowserDialog pour que.
Après des heures de recherche j'ai trouvé cette réponse par leetNightShade à une solution de travail.
Il y a trois choses que je crois que cette solution soit beaucoup mieux que tous les autres.
Il n'exige de vous d'inclure deux fichiers (qui peuvent être combinés pour un de toute façon) dans votre projet.
Télécharger le code ici.
Exact Audio Copy fonctionne de cette façon sur Windows XP. Le standard d'ouverture de fichier boîte de dialogue s'affiche, mais le champ nom de fichier contient le texte "nom de fichier sera ignoré."
Juste deviner ici, mais je soupçonne que la chaîne est injecté dans la zone de liste modifiable contrôle d'édition à chaque fois qu'un changement important est apporté à la boîte de dialogue. Tant que le champ n'est pas vide, et la boîte de dialogue indicateurs sont définis pour ne pas vérifier l'existence du fichier, la boîte de dialogue peut être fermé normalement.
Edit: c'est beaucoup plus facile que je ne le pensais. Voici le code en C++/MFC, vous pouvez le traduire dans l'environnement de votre choix.
Edit 2: Ce doit être la traduction en C#, mais je ne suis pas à l'aise en C# afin de ne pas me tirer dessus si ça ne fonctionne pas.
Edit 3: Enfin regardé le dialogue en question, dans Visual Studio 2005 (je n'ai pas accès à ça plus tôt). Ce n'est pas le standard de la boîte de dialogue ouvrir fichier! Si vous examinez les fenêtres dans Spy++ et de les comparer à un standard d'ouverture de fichier, vous allez voir que la structure et les noms de classes ne correspondent pas. Quand vous regardez de près, vous pouvez également apercevoir quelques différences entre le contenu des boîtes de dialogue. Ma conclusion est que Microsoft a complètement remplacé la boîte de dialogue standard de Visual Studio pour donner cette capacité. Ma solution ou quelque chose de similaire sera aussi proche que vous pouvez obtenir, sauf si vous êtes prêt pour votre propre code à partir de zéro.
OK, laissez-moi essayer de connecter le premier point 😉
En jouant un peu avec Spy++ ou Winspector montre que le Dossier de zone de texte dans le VS Emplacement du Projet est une personnalisation de la boîte de dialogue standard. Ce n'est pas le même domaine que le nom de fichier de zone de texte dans une boîte de dialogue standard fichier comme celui dans le bloc-notes.
À partir de là, je me figure, VS cache le nom de fichier et le type du fichier des zones de texte/zones de liste modifiables et utilise un custom modèle de boîte de dialogue pour ajouter sa propre part dans le fond de la boîte de dialogue.
EDIT: Voici un exemple de personnalisation et comment le faire (en Win32. pas .NET):
m_ofn est la structure OPENFILENAME qui sous-tend la boîte de dialogue de fichier. Ajouter ces 2 lignes:
où IDD_FILEDIALOG_IMPORTXLIFF est une coutume modèle de boîte de dialogue qui sera ajouté dans le bas de la boîte de dialogue. Voir la partie en rouge ci-dessous.
(source: apptranslator.com)
Dans ce cas, la mesure n'est qu'une étiquette + un lien hypertexte, mais il pourrait être n'importe quel dialogue. Elle pourrait contenir un bouton OK qui nous auraient permis de valider le dossier de sélection.
Mais comment nous débarrasser de certains des contrôles dans la partie standard de la boîte de dialogue, je ne sais pas.
Plus en détail dans cet article MSDN.
Vous pouvez sous-classe de la boîte de dialogue de fichier pour avoir accès à toutes ses commandes. Chacune dispose d'un identifiant qui peut être utilisé pour obtenir sa poignée de la fenêtre. Vous pouvez ensuite afficher et de masquer, de recevoir des messages de leur part, sur les changements de la sélection, etc. etc. Tout dépend de la quantité d'effort que vous voulez prendre.
Nous avons fait nôtre l'aide de WTL classe de soutien et personnalisé de la boîte de dialogue de fichier à inclure une coutume des lieux de la barre et de plug-in COM vues.
MSDN fournit des informations sur la façon de faire cela en utilisant Win32, cette CodeProject article contient un exemple, et cette CodeProject article fournit un .NET exemple.
Vous pouvez utiliser le code comme ceci
À avancé cacher de la zone de texte pour le nom de fichier que vous devez regarder
OpenFileDialogEx
Le code:
Je suppose que vous êtes sur Vista à l'aide de VS2008? Dans ce cas, je pense que le FOS_PICKFOLDERS option est utilisé lors de l'appel de la Vista de dialogue de fichier IFileDialog. J'ai peur que dans .NET code, cela impliquerait beaucoup de gnarly P/Invoke interop code de travail.
Première Solution
J'ai développé ce que un nettoyage de la version de .NET Win 7-dossier de style, sélectionnez la boîte de dialogue par le projet de Loi Seddon de lyquidity.com (je n'ai pas d'affiliation). (Je l'ai appris de son code de une autre réponse sur cette page). J'ai écrit mon propre parce que sa solution nécessite une Réflexion complémentaire de la classe qui n'est pas nécessaire pour cet objectif, utilise exception basée sur le contrôle de flux, ne pas mettre en cache les résultats de sa réflexion appels. Notez que le sous-statique
VistaDialog
classe est alors que sa statique de réflexion variables n'essayez pas d'obtenir remplie si leShow
méthode n'est jamais appelé. Il revient à la pré-Vista dialogue si ce n'est dans une assez grande version de Windows. Devrait fonctionner sous Windows 7, 8, 9, 10 et plus (théoriquement).Il est utilisé comme dans un Formulaire Windows:
Vous pouvez bien sûr jouer avec ses options, et quelles sont les propriétés qu'il expose. Par exemple, il permet la sélection multiple dans le Vista-style boîte de dialogue.
Deuxième Solution
Simon Mourier ont donné une réponse qui montre comment faire exactement le même travail à l'aide de l'interopérabilité à l'encontre de l'API Windows directement, même si sa version devrait être complétée d'utiliser l'ancienne boîte de dialogue style de si dans une version antérieure de Windows. Malheureusement, je n'avais pas trouvé son post, mais lorsque j'ai travaillé jusqu'à ma solution. Nommez votre poison!
Essayez de celui de la Codeproject (crédit à Nitron):
Je pense que c'est la même boîte de dialogue, vous parlez peut - être il serait utile si vous ajouter une capture d'écran?
Sur Vista, vous pouvez utiliser IFileDialog avec FOS_PICKFOLDERS option. Que va provoquer l'affichage de OpenFileDialog fenêtre où vous pouvez sélectionner des dossiers:
Pour les plus anciennes de Windows, vous pouvez toujours recourir à l'astuce avec la sélection de n'importe quel fichier dans le dossier.
Exemple de travail qui fonctionne sur .NET Framework 2.0 et plus tard peut être trouvé ici.
Vous pouvez utiliser le code comme ceci
Le filtre est une chaîne vide.
Le nom de fichier est AnyName mais pas vide
La Ookii les boîtes de dialogue de WPF bibliothèque dispose d'une classe qui fournit une mise en œuvre d'un dossier de dialogue du navigateur pour WPF.
Il y a aussi une version qui fonctionne avec Windows Forms.
Je sais que la question a été sur la configuration de
OpenFileDialog
mais vu que Google m'a amené ici, j'ai peut ainsi remarquer que si vous cherchez SEULEMENT pour les dossiers que vous devez être à l'aide d'unFolderBrowserDialog
Plutôt que de répondre par une autre DONC, la question ci-dessousComment spécifier le chemin à l'aide de dialogue d'ouverture de fichier dans vb.net?