Dialogue Ouvrir un répertoire

je veux que l'utilisateur de sélectionner un répertoire où un fichier que je génère ensuite sera sauvé. Je sais que dans WPF je devrais utiliser le OpenFileDialog de Win32, mais malheureusement la boîte de dialogue exige que le(S) fichier (s) soit sélectionné (s) - il reste ouvert si je clique simplement OK sans en choisir un. Je pourrais "Hacker" la fonctionnalité en laissant l'utilisateur choisir un fichier et puis rayer le chemin pour comprendre à quel répertoire il appartient, mais c'est peu intuitif au mieux. Quelqu'un a vu ce fait avant?

234
demandé sur H.B. 2009-12-17 17:38:51

13 réponses

vous pouvez utiliser la classe intégrée FolderBrowserDialog pour cela. Peu importe 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 voulez que la fenêtre soit modale sur une fenêtre WPF, voir la question comment utiliser un FolderBrowserDialog à partir d'une application WPF .


modifier: si vous voulez quelque chose un peu plus de fantaisie que la plaine, ugly Windows Forms FolderBrowserDialog, il y a des alternatives qui vous permettent d'utiliser la boîte de dialogue Vista à la place:

  • les bibliothèques de Tiers, tels que Ookii les boîtes de dialogue (.NET 3.5)
  • le Windows API Code Pack-Shell :

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

    notez que ce dialogue n'est pas disponible sur les systèmes d'exploitation plus anciens que Windows Vista, alors assurez-vous de vérifier CommonFileDialog.IsPlatformSupported d'abord.

350
répondu Heinzi 2018-09-03 08:50:48

j'ai créé un UserControl qui est utilisé comme ceci:

  <UtilitiesWPF:FolderEntry Text="{Binding Path=LogFolder}" Description="Folder for log files"/>

la source xaml ressemble à ceci:

<UserControl x:Class="Utilities.WPF.FolderEntry"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DockPanel>
        <Button Margin="0" Padding="0" DockPanel.Dock="Right" Width="Auto" Click="BrowseFolder">...</Button>
        <TextBox Height="Auto" HorizontalAlignment="Stretch" DockPanel.Dock="Right" 
           Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
    </DockPanel>
</UserControl>

et le code-derrière

public partial class FolderEntry {
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FolderEntry), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
    public static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(FolderEntry), new PropertyMetadata(null));

    public string Text { get { return GetValue(TextProperty) as string; } set { SetValue(TextProperty, value); }}

    public string Description { get { return GetValue(DescriptionProperty) as string; } 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();
            }
        }
    }
 }
33
répondu adrianm 2009-12-17 15:04:05

je suis l'aide de Ookii les boîtes de dialogue pendant un certain temps et de travail agréable pour WPF.

Voici la page directe:

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

8
répondu Rafael 2014-04-10 12:12:06

pour Dialogue de répertoire pour obtenir le chemin de répertoire, D'abord ajouter le système de référence.Windows.Les formes, puis Régler, puis mettez ce code dans un clic sur un bouton.

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

(folderpathTB est le nom de TextBox où je veux mettre le chemin du dossier, ou u peut l'assigner à une variable de chaîne de caractères trop i.e.)

    string folder = dialog.SelectedPath;

et si vous voulez obtenir le nom du fichier / chemin, faites simplement cela sur le bouton

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

(folderpathTB est le nom de Zone de texte où je wana mettre le chemin d'accès au fichier, OU u peut l'affecter à une variable de chaîne trop)

Note: pour le dialogue de Chemise, le système.Windows.Forme.dll doit être ajouté au projet, sinon ça ne marcherait pas.

6
répondu Zia Ur Rahman 2015-11-07 05:20:51

j'ai trouvé le code ci-dessous sur le lien ci-dessous... et cela a fonctionné dialogue Sélectionner un dossier WPF

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 string
}
5
répondu Saurabh Raoot 2017-05-23 12:17:59

la meilleure façon d'atteindre ce que vous voulez est de créer votre propre contrôle basé sur wpf , ou utiliser un qui a été fait par d'autres personnes

pourquoi ? parce qu'il y aura un impact de performance notable lors de l'utilisation de la boîte de dialogue winforms dans une application wpf (pour une raison quelconque)

je recommande ce projet

https://opendialog.codeplex.com/

ou Nuget:

PM> Install-Package OpenDialog

c'est très MVVM amical et il n'est pas wraping les winforms boîte de dialogue

4
répondu bigworld12 2015-07-12 17:47:37
La boîte de dialogue

du dossier Ookii se trouve à 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;
}
4
répondu Youngjae 2016-01-06 03:21:50

La Ookii VistaFolderBrowserDialog est celui que vous voulez.

si vous voulez seulement le navigateur de dossier de dialogue Ooki et rien d'autre alors télécharger la Source , cherry-choisir les fichiers dont vous avez besoin pour le navigateur de dossier (indice: 7 fichiers) et il construit fine dans .NET 4.5.2. J'ai dû ajouter une référence à System.Drawing . Comparez les références du projet original avec les vôtres.

Comment comprendre les fichiers? Ouvrez votre application et Ookii dans différentes instances de Visual Studio. Ajoutez VistaFolderBrowserDialog.cs à votre application et continuez à ajouter des fichiers jusqu'à ce que les erreurs de compilation disparaissent. Vous trouvez les dépendances dans le projet Ookii-Control-cliquez sur celle que vous voulez suivre à sa source (jeu de mots prévu).

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 voulez inclure leur Resources.Resx

throw new InvalidOperationException(Properties.Ressources.Folderbrowserdialogorootfolder);

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

ajoutez leur notice de copyright à votre application selon leur license.txt

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

Fonctionne sur Ma Machine [TM]

2
répondu CAD bloke 2016-04-27 13:28:05

je suggère, pour ajouter dans le paquet nugget:

  Install-Package OpenDialog

alors la façon 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.ToString();

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

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

2
répondu Jose Ortega 2016-06-17 08:54:18

je sais que c'est une vieille question, mais une façon simple de le faire est d'utiliser L'option FileDialog fournie par WPF et en utilisant le système.IO.Chemin.GetDirectory (filename).

2
répondu Gregory Eaton 2017-09-13 21:31:10

aucune de ces réponses ne fonctionnait pour moi (en général, il y avait une référence manquante ou quelque chose du genre)

mais cela tout simplement fait:

à l'Aide de FolderBrowserDialog en application WPF

ajouter une référence à System.Windows.Forms et utiliser ce code:

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

pas besoin de retrouver les paquets manquants. Ou ajouter des classes énormes

ce qui donne moi modernes d'un dossier sélecteur vous permet également de créer un nouveau dossier

je suis encore à voir l'impact lorsqu'il est déployé à d'autres machines

1
répondu Nick.McDermaid 2017-06-18 07:26:30

vous pouvez utiliser smth comme ceci dans WPF. J'ai créé l'exemple de la méthode. Découvrez ci-dessous.

public string 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;           
       }
1
répondu koberone 2018-04-12 21:46:13

pour ceux qui ne veulent pas créer une boîte de dialogue personnalisée, mais préfèrent quand même une méthode 100% WPF et ne veulent pas utiliser des DDLs séparés, des dépendances supplémentaires ou des API périmées, j'ai créé un hack très simple en utilisant la boîte de dialogue Enregistrer sous.

Non utiliser la directive 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 peut changer le titre de cette boîte de dialogue, cacher des fichiers, et travailler autour du nom de fichier résultant assez facilement.

c'est un gros hack pour sûr, mais peut-être qu'il fera le travail juste très bien pour votre usage...

dans cet exemple, j'ai un objet 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) {
    string 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;
}

Le seul problème avec ce hack sont :

  • bouton D'accusé de réception dit toujours "enregistrer" au lieu de quelque chose comme "Select directory", mais dans un cas comme les mines je "enregistrer" la sélection de répertoire de sorte qu'il fonctionne toujours...
  • champ D'entrée indique toujours "nom de fichier" au lieu de "nom de répertoire", mais nous pouvons dire qu'un répertoire est un type de fichier...
  • il y a encore une liste déroulante" Save as type", mais sa valeur indique " Directory (*.ce.répertoire)", et l'utilisateur ne peut pas le changer pour autre chose, fonctionne m'...

la plupart des gens ne les remarqueront pas, bien que je préférerais certainement utiliser une voie officielle WPF si microsoft sortirait leur tête de leurs culs, mais jusqu'à ce qu'ils le fassent, c'est ma solution temporaire.

1
répondu Olivier St-L 2018-05-09 20:43:00