Sélectionner le dialogue du dossier WPF

je développe une application WPF4 et dans mon application je dois laisser l'utilisateur choisir un dossier où l'application stockera quelque chose (fichiers, rapports générés, etc.).

mes exigences:

  • possibilité de voir l'arbre des dossiers standard

  • possibilité de sélectionner un dossier

  • WPF "look & feel", ce dialogue doit ressembler à une partie d'un application moderne conçue pour Windows Vista / 7 et non Windows 2000 ou même Win9x.

d'après ce que j'ai compris, jusqu'en 2010 (.Net 4.0) il n'y aura pas de dialogue de chemise standard, mais il y a peut-être des changements dans la version 4.0?

ou tout ce qui reste à faire est d'utiliser la boîte de dialogue WinForms old-school? Si c'est le seul moyen de faire ce dont j'ai besoin, Comment puis-je le rendre plus proche du style Vista/7 et pas de Win9x?

sur certains forums, j'ai vu la mise en œuvre de tels dialogues mais avec de vieilles icônes laides à La Windows 95. Il n'a vraiment pas l'air bien.

58
demandé sur Mike B. 2010-10-24 14:36:31

9 réponses

j'ai écrit à ce sujet sur mon blog il y a longtemps, le soutien de WPF pour les dialogues de fichiers communs est vraiment mauvais (ou du moins est était en 3.5 Je n'ai pas vérifié dans la version 4) - mais il est facile de travailler autour de lui.

vous devez ajouter le manifeste correct à votre application - qui vous donnera un style moderne boîtes de messages et le navigateur de dossiers (WinForms FolderBrowserDialog) mais pas WPF Ouvrir Fichier/Enregistrer dialogues, ce qui est décrit dans ces 3 messages (si vous ne vous souciez pas de l'explication et ne veulent que la solution aller directement à la troisième):

Heureusement, les boîtes de dialogue open/save sont très minces autour de L'API Win32 qui est facile à appeler avec les bons drapeaux pour obtenir le style Vista/7 (après avoir défini le manifeste)

18
répondu Nir 2010-10-24 15:18:01

Windows Presentation Foundation 4.5 Cookbook par Pavel Yosifovich à la page 155 dans la section "Utiliser les boîtes de dialogue communes" dit:

" Qu'en est-il de la sélection des dossiers (au lieu des fichiers)? WPF OpenFileDialog ne supporte pas cela. Une solution est D'utiliser Windows Classe de FolderBrowseDialog de Forms. Une autre bonne solution est d'utiliser la Windows API Code Pack décrit sous peu."

j'ai téléchargé le code API Pack de Windows ® API Code Pack for Microsoft®. NET Framework Windows API Code Pack: Où est-il? , puis a ajouté des références à Microsoft.WindowsAPICodePack.dll et Microsoft.WindowsAPICodePack.Shell.dll sur mon projet WPF 4.5.

exemple:

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
}
91
répondu T Powers 2017-05-23 12:02:53

Ajouter de L'API Windows Pack de Code-Shell à votre projet

using Microsoft.WindowsAPICodePack.Dialogs;

...

var dialog = new CommonOpenFileDialog();
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
6
répondu zeynab farzaneh 2016-07-23 13:53:33

Microsoft.Win32.OpenFileDialog est la boîte de dialogue standard que toute application Windows utilise. Votre utilisateur ne sera pas surpris de son apparence lorsque vous utilisez WPF dans .NET 4.0

le dialogue a été modifié dans Vista. Dans .NET 3.0 et 3.5, WPF utilisait toujours la boîte de dialogue legacy, mais celle-ci a été corrigée dans .NET 4.0. Je ne peux que deviner que vous avez commencé ce fil parce que vous voyez ce vieux dialogue. Ce qui veut probablement dire que vous dirigez un programme qui cible 3.5. Oui, le WinForms wrapper a fait obtenir la mise à jour et montre la version Vista. Système.Windows.Forme.Classe OpenFileDialog, vous aurez besoin d'ajouter une référence au système.Windows.Forme.

5
répondu Hans Passant 2010-10-24 11:43:58

MVVM + WinForms FolderBrowserDialog as behavior""

public class FolderDialogBehavior : Behavior<Button>
{
    public string SetterName { get; set; }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Click += OnClick;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Click -= OnClick;
    }

    private void OnClick(object sender, RoutedEventArgs e)
    {
        var dialog = new FolderBrowserDialog();
        var result = dialog.ShowDialog();
        if (result == DialogResult.OK && AssociatedObject.DataContext != null)
        {
            var propertyInfo = AssociatedObject.DataContext.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
            .Where(p => p.CanRead && p.CanWrite)
            .Where(p => p.Name.Equals(SetterName))
            .First();

            propertyInfo.SetValue(AssociatedObject.DataContext, dialog.SelectedPath, null);
        }
    }
}

Utilisation

     <Button Grid.Column="3" Content="...">
            <Interactivity:Interaction.Behaviors>
                <Behavior:FolderDialogBehavior SetterName="SomeFolderPathPropertyName"/>
            </Interactivity:Interaction.Behaviors>
     </Button>

article sur le Blog: http://kostylizm.blogspot.ru/2014/03/wpf-mvvm-and-winforms-folder-dialog-how.html

5
répondu Oyun 2014-04-04 13:37:25

basé sur la réponse D'Oyun, il est préférable d'utiliser une propriété de dépendance pour le FolderName. Cela permet (par exemple) de lier des sous-Propriétés, ce qui ne fonctionne pas dans l'original. De plus, dans ma version ajustée, la boîte de dialogue affiche la sélection du dossier initial.

utilisation dans XAML:

<Button Content="...">
   <i:Interaction.Behaviors>
      <Behavior:FolderDialogBehavior FolderName="{Binding FolderPathPropertyName, Mode=TwoWay}"/>
    </i:Interaction.Behaviors>
</Button>

Code:

using System.Windows;
using System.Windows.Forms;
using System.Windows.Interactivity;
using Button = System.Windows.Controls.Button;

public class FolderDialogBehavior : Behavior<Button>
{
    #region Attached Behavior wiring
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Click += OnClick;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Click -= OnClick;
        base.OnDetaching();
    }
    #endregion

    #region FolderName Dependency Property
    public static readonly DependencyProperty FolderName =
            DependencyProperty.RegisterAttached("FolderName",
            typeof(string), typeof(FolderDialogBehavior));

    public static string GetFolderName(DependencyObject obj)
    {
        return (string)obj.GetValue(FolderName);
    }

    public static void SetFolderName(DependencyObject obj, string value)
    {
        obj.SetValue(FolderName, value);
    }
    #endregion

    private void OnClick(object sender, RoutedEventArgs e)
    {
        var dialog = new FolderBrowserDialog();
        var currentPath = GetValue(FolderName) as string;
        dialog.SelectedPath = currentPath;
        var result = dialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            SetValue(FolderName, dialog.SelectedPath);
        }
    }
}
2
répondu Edward 2015-03-09 15:13:41

si vous ne voulez pas utiliser les formulaires Windows ni éditer les fichiers manifest, j'ai créé un hack très simple en utilisant la boîte de dialogue SaveAs de WPF pour sélectionner un répertoire.

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 pouvons 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" sauve " 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.directory)", et l'utilisateur ne peut pas le changer pour autre chose, fonctionne pour moi...

Most les gens ne les remarqueront pas, bien que je préférerais certainement utiliser une méthode officielle de WPF si microsoft leur enlevait la tête de leur cul, mais jusqu'à ce qu'ils le fassent, c'est ma solution temporaire.

2
répondu Olivier St-L 2018-05-09 20:54:35

les dialogues Ookii pour WPF ont une classe VistaFolderBrowserDialog qui fournit une implémentation complète d'un dialogue de navigateur de dossier pour WPF.

https://github.com/caioproiete/ookii-dialogs-wpf

enter image description here

il y a aussi une version qui fonctionne avec Windows Forms .

1
répondu Caio Proiete 2018-10-04 03:32:25

seul ce dialogue est FileDialog . Sa partie de WinForms, mais en fait son envelopper seulement autour de WinAPI fichier OS standard dialogue. Et je ne pense pas qu'il soit laid, il fait en fait partie de OS, donc il ressemble à OS il est exécuté sur.

autrement, il n'y a rien pour vous aider. Vous devez soit chercher la mise en œuvre par un tiers, soit gratuitement (et je ne pense pas qu'il y ait de bon) ou payé.

0
répondu Euphoric 2017-08-03 09:06:55