Dans VS .NET, lorsque vous sélectionnez un dossier pour un projet, une boîte de dialogue qui ressemble à un OpenFileDialog ou SaveFileDialog s'affiche, mais est configurée pour accepter uniquement les dossiers. Depuis que j'ai vu ça, je veux savoir comment ça se passe. Je connais le FolderBrowserDialog, mais je n'ai jamais vraiment aimé cette boîte de dialogue. Il commence trop petit et ne me permet pas de saisir un chemin.
Je suis presque certain maintenant qu'il n'y a aucun moyen de le faire à partir de .NET, mais je suis tout aussi curieux de savoir comment vous le faites à partir de code non managé. À moins de réimplémenter complètement la boîte de dialogue à partir de zéro, comment modifiez-vous la boîte de dialogue pour avoir ce comportement?
Je voudrais également réaffirmer que je connais le 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 dire de simplement utiliser le FolderBrowserDialog m'aide à maintenir une expérience d'interface utilisateur cohérente mais ne satisfait pas ma curiosité, donc cela ne comptera pas comme une réponse.
Ce n'est pas une chose spécifique à Vista non plus; J'ai vu cette boîte de dialogue depuis VS .NET 2003, donc c'est faisable dans Win2k et WinXP. Il s'agit moins d'une question «Je veux savoir comment faire correctement» et plus d'une question «J'ai été curieuse à ce sujet depuis que je voulais le faire dans VS 2003». Je comprends que la boîte de dialogue de fichier de Vista a une option pour le faire, mais cela fonctionne sous XP, donc je sais qu'ils ont fait quelque chose pour le faire fonctionner. Les réponses spécifiques à Vista ne sont pas des réponses, car Vista n'existe pas dans le contexte des questions.
Mise à jour: Je suis d' accepter la réponse de Scott Wisniewski parce qu'il est livré avec un échantillon de travail, mais je pense que Serge mérite pour pointer la personnalisation de dialogue (qui est certes désagréable de .NET , mais il fait le travail) et Mark Ransom pour déterminer que MS a probablement lancé une boîte de dialogue personnalisée pour cette tâche.
la source
dialog.FileName = "Folder Selection"
censé êtredialog.FileName = "Folder Selection."
avec la période de fuite? de toute façon je ne peux pas le faire fonctionner en PowerShell sur le deuxième clic de "Open" de toute façon. Il continue de dire que le fichier est introuvable, même si CheckFileExists est censé être fauxdialog.CheckFileExists = 0
au lieu de faux résolu mon problèmeRéponses:
J'ai une boîte de dialogue que j'ai écrite appelée une boîte de dialogue OpenFileOrFolder qui vous permet d'ouvrir un dossier ou un fichier.
Si vous définissez sa valeur AcceptFiles sur false, il fonctionne uniquement en mode dossier d'acceptation.
Vous pouvez télécharger la source depuis GitHub ici
la source
Vous pouvez utiliser FolderBrowserDialogEx - un dérivé réutilisable du FolderBrowserDialog intégré. Celui-ci vous permet de taper un chemin, même un chemin UNC. Vous pouvez également rechercher des ordinateurs ou des imprimantes avec elle. Fonctionne comme le FBD intégré, mais ... mieux.
(EDIT: j'aurais dû souligner que cette boîte de dialogue peut être définie pour sélectionner des fichiers ou des dossiers.)
Code source complet (un court module C #). Libre. Licence MS-Public.
Code pour l'utiliser:
la source
Il y a le pack de codes Windows API. Il y a beaucoup de choses liées au shell, y compris la
CommonOpenFileDialog
classe (dans l'Microsoft.WindowsAPICodePack.Dialogs
espace de noms). C'est la solution parfaite - la boîte de dialogue ouverte habituelle avec uniquement les dossiers affichés.Voici un exemple d'utilisation:
Malheureusement, Microsoft ne livre plus ce package, mais plusieurs personnes ont téléchargé officieusement des fichiers binaires sur NuGet. Un exemple peut être trouvé ici . Ce paquet est juste le truc spécifique au shell. Si vous en avez besoin, le même utilisateur a plusieurs autres packages qui offrent plus de fonctionnalités présentes dans le package d'origine.
la source
Le package Ookii.Dialogs contient un wrapper géré autour de la nouvelle boîte de dialogue du navigateur de dossiers (de style Vista). Il se dégrade également gracieusement sur les anciens systèmes d'exploitation.
la source
OpenFileDialog
boîte de dialogue de dossier de style.Mieux vaut utiliser le FolderBrowserDialog pour cela.
la source
Après des heures de recherche, j'ai trouvé cette réponse par leetNightShade à une solution de travail .
Je pense qu'il y a trois choses qui rendent cette solution bien meilleure que toutes les autres.
Téléchargez le code ici .
la source
Exact Audio Copy fonctionne de cette façon sur Windows XP. La boîte de dialogue d'ouverture de fichier standard s'affiche, mais le champ du nom de fichier contient le texte "Le nom de fichier sera ignoré".
Je devine juste ici, mais je soupçonne que la chaîne est injectée dans le contrôle d'édition de la zone de liste déroulante chaque fois qu'une modification importante est apportée à la boîte de dialogue. Tant que le champ n'est pas vide et que les indicateurs de dialogue sont définis pour ne pas vérifier l'existence du fichier, la boîte de dialogue peut être fermée 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: Cela devrait être la traduction en C #, mais je ne parle pas couramment C #, alors ne me tirez pas dessus si cela ne fonctionne pas.
Edit 3: enfin regardé la boîte de dialogue en question, dans Visual Studio 2005 (je n'y avais pas accès plus tôt). Ce n'est pas la boîte de dialogue d'ouverture de fichier standard! Si vous inspectez les fenêtres dans Spy ++ et les comparez à un fichier standard ouvert, vous verrez que la structure et les noms de classe ne correspondent pas. Lorsque vous regardez de plus près, vous pouvez également repérer certaines 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 dans Visual Studio pour lui donner cette capacité. Ma solution ou quelque chose de similaire sera aussi proche que possible, à moins que vous ne souhaitiez coder la vôtre à partir de zéro.
la source
OK, permettez-moi d'essayer de connecter le premier point ;-) Jouer un peu avec Spy ++ ou Winspector montre que la zone de texte Dossier dans l'emplacement du projet VS est une personnalisation de la boîte de dialogue standard. Ce n'est pas le même champ que la zone de texte du nom de fichier dans une boîte de dialogue de fichier standard telle que celle du Bloc-notes.
À partir de là, je pense que VS cache le nom de fichier et les zones de texte / combobox de type de fichier et utilise un modèle de boîte de dialogue personnalisé pour ajouter sa propre partie au bas de la boîte de dialogue.
EDIT: Voici un exemple d'une telle personnalisation et comment le faire (dans Win32. Pas .NET):
m_ofn est la structure OPENFILENAME qui sous-tend la boîte de dialogue de fichier. Ajoutez ces 2 lignes:
où IDD_FILEDIALOG_IMPORTXLIFF est un modèle de boîte de dialogue personnalisé qui sera ajouté au bas de la boîte de dialogue. Voir la partie en rouge ci-dessous. (source: apptranslator.com )
Dans ce cas, la pièce personnalisée n'est qu'une étiquette + un lien hypertexte mais il peut s'agir de n'importe quelle boîte de dialogue. Il pourrait contenir un bouton OK qui nous permettrait de valider la sélection du dossier uniquement.
Mais comment nous pourrions nous débarrasser de certains des contrôles dans la partie standard de la boîte de dialogue, je ne sais pas.
Plus de détails dans cet article MSDN .
la source
Vous pouvez sous-classer la boîte de dialogue de fichier et accéder à tous ses contrôles. Chacun a un identifiant qui peut être utilisé pour obtenir son handle de fenêtre. Vous pouvez ensuite les afficher et les masquer, obtenir des messages de leur part sur les changements de sélection, etc. etc. Tout dépend de l'effort que vous souhaitez consacrer.
Nous avons fait le nôtre en utilisant le support de classe WTL et personnalisé la boîte de dialogue de fichier pour inclure une barre d'espaces personnalisée et des vues COM de plug-in.
MSDN fournit des informations sur la façon de procéder à l'aide de Win32, cet article CodeProject comprend un exemple et cet article CodeProject fournit un exemple .NET .
la source
Vous pouvez utiliser du code comme celui-ci
Pour masquer la zone de texte avancée pour le nom de fichier, vous devez regarder OpenFileDialogEx
Le code:
la source
Je suppose que vous utilisez Vista sous VS2008? Dans ce cas, je pense que l' option FOS_PICKFOLDERS est utilisée lors de l'appel de la boîte de dialogue de fichier Vista IFileDialog . Je crains que dans le code .NET, cela implique beaucoup de code d'interopérabilité P / Invoke noueux pour fonctionner.
la source
Première solution
J'ai développé cela comme une version nettoyée de la boîte de dialogue de sélection de dossier de style .NET Win 7 par Bill Seddon de lyquidity.com (je n'ai aucune affiliation). (J'ai appris son code d' une autre réponse sur cette page ). J'ai écrit le mien parce que sa solution nécessite une classe de réflexion supplémentaire qui n'est pas nécessaire à cette fin, utilise un contrôle de flux basé sur des exceptions, ne met pas en cache les résultats de ses appels de réflexion. Notez que la
VistaDialog
classe statique imbriquée est telle que ses variables de réflexion statique n'essaient pas d'être renseignées si laShow
méthode n'est jamais appelée. Il revient à la boîte de dialogue pré-Vista si ce n'est pas dans une version Windows suffisamment élevée. Devrait fonctionner sous Windows 7, 8, 9, 10 et supérieur (théoriquement).Il est utilisé comme tel dans un Windows Form:
Vous pouvez bien sûr jouer avec ses options et les propriétés qu'il expose. Par exemple, il permet la sélection multiple dans la boîte de dialogue de style Vista.
Deuxième solution
Simon Mourier a donné une réponse qui montre comment faire exactement le même travail en utilisant l'interopérabilité directement avec l'API Windows, bien que sa version devrait être complétée pour utiliser l'ancienne boîte de dialogue de style si dans une ancienne version de Windows. Malheureusement, je n'avais pas encore trouvé son poste lorsque j'ai élaboré ma solution. Nommez votre poison!
la source
Essayez celui-ci de Codeproject (crédit à Nitron):
Je pense que c'est la même boîte de dialogue dont vous parlez - peut-être que cela aiderait si vous ajoutez une capture d'écran?
la source
Sur Vista, vous pouvez utiliser IFileDialog avec le jeu d'options FOS_PICKFOLDERS. Cela entraînera l'affichage d'une fenêtre de type OpenFileDialog où vous pourrez sélectionner des dossiers:
Pour les anciennes versions de Windows, vous pouvez toujours recourir à une astuce pour sélectionner un fichier dans un dossier.
Un exemple de travail qui fonctionne sur .NET Framework 2.0 et versions ultérieures peut être trouvé ici .
la source
Vous pouvez utiliser du code comme celui-ci
Le filtre est une chaîne vide. Le nom de fichier est AnyName mais pas vide
la source
La bibliothèque Ookii Dialogs for WPF possède une classe qui fournit une implémentation d'une boîte de dialogue de navigateur de dossiers pour WPF.
Il existe également une version qui fonctionne avec Windows Forms .
la source
Je sais que la question portait sur la configuration de
OpenFileDialog
mais vu que Google m'a amené ici, je peux aussi souligner que si vous recherchez UNIQUEMENT des dossiers, vous devriez utiliser unFolderBrowserDialog
Au lieu de répondre par une autre question SO ci-dessousComment spécifier le chemin en utilisant la boîte de dialogue d'ouverture de fichier dans vb.net?
la source