Ouvrir la boîte de dialog du répertoire

Je souhaite que l’utilisateur sélectionne un répertoire dans lequel un fichier que je vais générer sera enregistré. Je sais que dans WPF, je devrais utiliser OpenFileDialog partir de Win32, mais malheureusement la boîte de dialog requirejs la sélection de fichiers – elle rest ouverte si je clique simplement sur OK sans en choisir un. Je pourrais “pirater” la fonctionnalité en laissant l’utilisateur choisir un fichier, puis en supprimant le chemin pour déterminer le répertoire auquel il appartient, mais ce n’est pas du tout intuitif. Quelqu’un a-t-il déjà vu ça?

Vous pouvez utiliser la classe FolderBrowserDialog intégrée pour cela. Cela ne vous dérange pas que ce soit dans l’espace de noms System.Windows.Forms .

 using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) { System.Windows.Forms.DialogResult result = dialog.ShowDialog(); } 

Si vous souhaitez que la fenêtre soit modale sur une fenêtre WPF, consultez la question Comment utiliser un FolderBrowserDialog à partir d’une application WPF .


EDIT: Si vous voulez quelque chose d’un peu plus sophistiqué que le simple Windows Forms FolderBrowserDialog, il existe des alternatives vous permettant d’utiliser la boîte de dialog de Vista à la place:

  • Bibliothèques tierces, telles que les boîtes de dialog Ookii (.NET 3.5)
  • Le pack de code API Windows-Shell :

     using Microsoft.WindowsAPICodePack.Dialogs; ... var dialog = new CommonOpenFileDialog(); dialog.IsFolderPicker = true; CommonFileDialogResult result = dialog.ShowDialog(); 

    Notez que cette boîte de dialog n’est pas disponible sur les systèmes d’exploitation antérieurs à Windows Vista. Assurez-vous de vérifier d’abord CommonFileDialog.IsPlatformSupported .

J’ai créé un UserControl qui est utilisé comme ceci:

   

La source xaml ressemble à ceci:

       

et le code-behind

 public partial class FolderEntry { public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(ssortingng), typeof(FolderEntry), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(ssortingng), typeof(FolderEntry), new PropertyMetadata(null)); public ssortingng Text { get { return GetValue(TextProperty) as ssortingng; } set { SetValue(TextProperty, value); }} public ssortingng Description { get { return GetValue(DescriptionProperty) as ssortingng; } set { SetValue(DescriptionProperty, value); } } public FolderEntry() { InitializeComponent(); } private void BrowseFolder(object sender, RoutedEventArgs e) { using (FolderBrowserDialog dlg = new FolderBrowserDialog()) { dlg.Description = Description; dlg.SelectedPath = Text; dlg.ShowNewFolderButton = true; DialogResult result = dlg.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK) { Text = dlg.SelectedPath; BindingExpression be = GetBindingExpression(TextProperty); if (be != null) be.UpdateSource(); } } } } 

J’utilise les dialogs Ookii depuis un moment et cela fonctionne bien pour WPF.

Voici la page directe:

http://www.ookii.org/Blog/new_download_ookiidialogs

Pour que la boîte de dialog Répertoire obtienne le chemin du répertoire, ajoutez d’abord la référence System.Windows.Forms, puis Résolvez, puis placez ce code en un clic de bouton.

  var dialog = new FolderBrowserDialog(); dialog.ShowDialog(); folderpathTB.Text = dialog.SelectedPath; 

(folderpathTB est le nom de TextBox où je vais mettre le chemin du dossier, OU vous pouvez l’affecter à une variable de chaîne, c.-à-d.)

  ssortingng folder = dialog.SelectedPath; 

Et si vous voulez obtenir FileName / path, faites-le simplement sur Button Click

  FileDialog fileDialog = new OpenFileDialog(); fileDialog.ShowDialog(); folderpathTB.Text = fileDialog.FileName; 

(folderpathTB est le nom de TextBox où je vais mettre le chemin d’access au fichier, OU vous pouvez également l’assigner à une variable de chaîne)

Remarque: Pour la boîte de dialog Dossier, System.Windows.Forms.dll doit être ajouté au projet, sinon cela ne fonctionnerait pas.

J’ai trouvé le code ci-dessous sur le lien ci-dessous … et ça a fonctionné

 using Microsoft.WindowsAPICodePack.Dialogs; var dlg = new CommonOpenFileDialog(); dlg.Title = "My Title"; dlg.IsFolderPicker = true; dlg.InitialDirectory = currentDirectory; dlg.AddToMostRecentlyUsedList = false; dlg.AllowNonFileSystemItems = false; dlg.DefaultDirectory = currentDirectory; dlg.EnsureFileExists = true; dlg.EnsurePathExists = true; dlg.EnsureReadOnly = false; dlg.EnsureValidNames = true; dlg.Multiselect = false; dlg.ShowPlacesList = true; if (dlg.ShowDialog() == CommonFileDialogResult.Ok) { var folder = dlg.FileName; // Do something with selected folder ssortingng } 

La meilleure façon de réaliser ce que vous voulez est de créer votre propre contrôle basé sur wpf, ou d’utiliser un contrôle créé par d’autres personnes.
Pourquoi ? car il y aura un impact notable sur les performances lors de l’utilisation de la boîte de dialog winforms dans une application wpf (pour une raison quelconque)
je recommande ce projet
https://opendialog.codeplex.com/
ou Nuget:

 PM> Install-Package OpenDialog 

il est très convivial MVVM et il ne couvre pas la boîte de dialog winforms

La boîte de dialog de dossier Ookii peut être trouvée chez Nuget.

PM> Install-Package Ookii.Dialogs

Et, exemple de code est comme ci-dessous.

 var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog(); if (dialog.ShowDialog(this).GetValueOrDefault()) { textBoxFolderPath.Text = dialog.SelectedPath; } 

Le Ookii VistaFolderBrowserDialog est celui que vous voulez.

Si vous ne voulez que le navigateur de dossiers d’ Ooki Dialogs et rien d’autre, téléchargez la source , sélectionnez les fichiers dont vous avez besoin pour le navigateur de dossiers (indice: 7 fichiers) et il se développe bien dans .NET 4.5.2. J’ai dû append une référence à System.Drawing . Comparez les références dans le projet d’origine avec les vôtres.

Comment déterminez-vous quels fichiers? Ouvrez votre application et Ookii dans différentes instances de Visual Studio. Ajoutez VistaFolderBrowserDialog.cs à votre application et continuez à append des fichiers jusqu’à ce que les erreurs de compilation disparaissent. Vous trouvez les dépendances dans le projet Ookii – Contrôle-Clique sur celui que vous souhaitez suivre à sa source (jeu de mots).

Voici les fichiers dont vous avez besoin si vous êtes trop paresseux pour le faire …

 NativeMethods.cs SafeHandles.cs VistaFolderBrowserDialog.cs \ Interop COMGuids.cs ErrorHelper.cs ShellComInterfaces.cs ShellWrapperDefinitions.cs 

Modifier la ligne 197 dans VistaFolderBrowserDialog.cs sauf si vous souhaitez inclure leurs Resources.Resx

lancer une nouvelle InvalidOperationException (Properties.Resources.FolderBrowserDialogNoRootFolder);

 throw new InvalidOperationException("Unable to resortingeve the root folder."); 

Ajouter leur avis de copyright à votre application selon leur license.txt

Le code de la ligne 160-169 de \Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.cs est un exemple que vous pouvez utiliser, mais vous devrez le supprimer de MessageBox.Show(this, pour WPF).

Fonctionne sur ma machine [TM]

Je suggère, pour append dans le paquet nugget:

  Install-Package OpenDialog 

Alors la manière de l’utiliser est:

  Gat.Controls.OpenDialogView openDialog = new Gat.Controls.OpenDialogView(); Gat.Controls.OpenDialogViewModel vm = (Gat.Controls.OpenDialogViewModel)openDialog.DataContext; vm.IsDirectoryChooser = true; vm.Show(); WPFLabel.Text = vm.SelectedFilePath.ToSsortingng(); 

Voici la documentation: http://opendialog.codeplex.com/documentation

Fonctionne pour les fichiers, les fichiers avec filtre, les dossiers, etc.

Je sais que c’est une vieille question, mais une manière simple de le faire est d’utiliser l’option FileDialog fournie par WPF et d’utiliser System.IO.Path.GetDirectory (filename).

Aucune de ces réponses n’a fonctionné pour moi (en général, il manquait une référence ou quelque chose du genre)

Mais tout simplement:

Utilisation de FolderBrowserDialog dans l’application WPF

Ajoutez une référence à System.Windows.Forms et utilisez ce code:

  var dialog = new System.Windows.Forms.FolderBrowserDialog(); System.Windows.Forms.DialogResult result = dialog.ShowDialog(); 

Pas besoin de retrouver les paquets manquants. Ou append d’énormes classes

Cela me donne un sélecteur de dossier moderne qui vous permet également de créer un nouveau dossier

Je n’ai pas encore vu l’impact lors du déploiement sur d’autres machines

Vous pourriez utiliser smth comme ceci dans WPF. J’ai créé un exemple de méthode. Vérifiez ci-dessous.

 public ssortingng getFolderPath() { // Create OpenFileDialog Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Multiselect = false; openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (openFileDialog.ShowDialog() == true) { System.IO.FileInfo fInfo = new System.IO.FileInfo(openFileDialog.FileName); return fInfo.DirectoryName; } return null; } 

Pour ceux qui ne veulent pas créer une boîte de dialog personnalisée mais préfèrent toujours une méthode 100% WPF et ne veulent pas utiliser des DDL séparés, des dépendances supplémentaires ou des API obsolètes, j’ai trouvé un hack très simple en utilisant la boîte de dialog Enregistrer sous.

Aucune directive d’utilisation nécessaire, vous pouvez simplement copier-coller le code ci-dessous!

Il devrait toujours être très convivial et la plupart des gens ne le remarqueront jamais.

L’idée vient du fait que nous pouvons changer le titre de cette boîte de dialog, cacher les fichiers et contourner le nom de fichier résultant assez facilement.

C’est un gros hack à coup sûr, mais peut-être qu’il fera le travail très bien pour votre usage …

Dans cet exemple, j’ai un object textbox pour contenir le chemin résultant, mais vous pouvez supprimer les lignes associées et utiliser une valeur de retour si vous le souhaitez …

 // Create a "Save As" dialog for selecting a directory (HACK) var dialog = new Microsoft.Win32.SaveFileDialog(); dialog.InitialDirectory = textbox.Text; // Use current value for initial dir dialog.Title = "Select a Directory"; // instead of default "Save As" dialog.Filter = "Directory|*.this.directory"; // Prevents displaying files dialog.FileName = "select"; // Filename will then be "select.this.directory" if (dialog.ShowDialog() == true) { ssortingng path = dialog.FileName; // Remove fake filename from resulting path path = path.Replace("\\select.this.directory", ""); path = path.Replace(".this.directory", ""); // If user has changed the filename, create the new directory if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); } // Our final value is in path textbox.Text = path; } 

Les seuls problèmes avec ce hack sont:

  • Le bouton Acknowledge indique toujours “Enregistrer” au lieu de quelque chose comme “Sélectionner un répertoire”, mais dans un cas comme les mines, je “Sauvegarde” la sélection du répertoire pour qu’elle fonctionne toujours …
  • Le champ de saisie indique toujours “Nom du fichier” au lieu de “Nom du répertoire”, mais on peut dire qu’un répertoire est un type de fichier …
  • Il y a toujours une liste déroulante “Enregistrer sous le type”, mais sa valeur indique “Répertoire (* .this.directory)”, et l’utilisateur ne peut pas le changer pour autre chose, fonctionne pour moi …

La plupart des gens ne le remarqueront pas, même si je préférerais utiliser une méthode WPF officielle si microsoft sortait la tête, mais en attendant, c’est ma solution temporaire.