73 votes

Dialogue de sélection de dossier WPF

Je développe une application WPF4 et dans mon application, je dois laisser l'utilisateur sélectionner un dossier dans lequel l'application va stocker quelque chose (fichiers, rapports générés, etc.).

Mes exigences :

  • Possibilité de voir l'arborescence standard des dossiers

  • Possibilité de sélectionner un dossier

  • Cette boîte de dialogue doit avoir l'air de faire partie d'une application moderne conçue pour Windows Vista/7 et non pour 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 standard pour les dossiers, mais il y a peut-être des changements dans la version 4.0 ?

Ou tout ce qui reste à faire est d'utiliser le dialogue WinForms de la vieille école ? 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 non Win9x ?

Sur certains forums, j'ai vu l'implémentation de telles boîtes de dialogue mais avec de vieilles icônes laides à la Windows 95. Ce n'est vraiment pas beau à voir.

2 votes

Regardez la fantastique vidéo de Sven Groot Ookii.Dialogues pour WinForms et WPF, qui vous offrent des boîtes de dialogue de dossiers et de fichiers modernes de style "Vista".

0 votes

J'utilise le module python wxPython github.com/wxWidgets/Phoenix

1 votes

Voici un lien vers une mise à jour Dialogues Ookii pour WPF ciblant .NET 4.5 et disponible sur NuGet

111voto

T Powers Points 461

Livre de recettes Windows Presentation Foundation 4.5 par Pavel Yosifovich à la page 155 dans la section "Utilisation des boîtes de dialogue communes" dit :

"Qu'en est-il de la sélection des dossiers (au lieu des fichiers) ? Le WPF OpenFileDialog ne le prend pas en charge. Une solution consiste à utiliser la classe FolderBrowseDialog de Windows Forms, FolderBrowseDialog. Une autre bonne solution est d'utiliser le Windows API Code Pack décrit prochainement."

J'ai téléchargé le Code Pack API à partir de Code Pack API Windows® pour Microsoft® .NET Framework Pack de code API Windows : Où est-il ? J'ai ensuite ajouté des références à Microsoft.WindowsAPICodePack.dll et Microsoft.WindowsAPICodePack.Shell.dll à 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
}

136 votes

Je ne peux pas croire que Microsoft n'ait pas pris la peine d'inclure un FolderBrowserDialog par défaut dans WPF...

24 votes

Les Code Packs de l'API Windows sont disponibles via Nuget. aquí y aquí . Cela a bien fonctionné pour moi.

3 votes

Cela fonctionne bien pour moi. De plus, j'ai juste écrit les commandes ci-dessous pour que le post contienne toutes les informations. Installation via la console du gestionnaire de paquets dans VS "Install-Package Windows7APICodePack-Core" , "Install-Package Windows7APICodePack-Shell".

21voto

Nir Points 18250

J'en ai parlé sur mon blog il y a longtemps, la prise en charge par WPF des dialogues de fichiers communs est vraiment mauvaise (ou du moins l'était-elle dans la version 3.5, je n'ai pas vérifié dans la version 4) - mais il est facile de la contourner.

Vous devez ajouter le manifeste correct à votre application - cela vous donnera des boîtes de messages de style moderne et un navigateur de dossiers (WinForms FolderBrowserDialog) mais pas les dialogues d'ouverture/enregistrement de fichiers WPF, ceci est décrit dans ces 3 posts (si vous ne vous souciez pas de l'explication et que vous voulez seulement la solution, allez directement au 3ème) :

Heureusement, les boîtes de dialogue ouvrir/enregistrer sont des enveloppes très fines autour de l'API Win32 qui sont faciles à appeler avec les bons drapeaux pour obtenir le style Vista/7 (après avoir défini le manifeste).

5voto

Oyun Points 51

MVVM + WinForms FolderBrowserDialog comme comportement

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>

Blogpost : http://kostylizm.blogspot.ru/2014/03/wpf-mvvm-and-winforms-folder-dialog-how.html

4voto

Hans Passant Points 475940

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

La boîte de dialogue a été modifiée dans Vista. WPF dans .NET 3.0 et 3.5 utilisait toujours l'ancienne boîte de dialogue mais cela a été corrigé dans .NET 4.0. Je ne peux que supposer que vous avez ouvert ce fil de discussion parce que vous voyez cette ancienne boîte de dialogue. Ce qui signifie probablement que vous exécutez un programme qui vise la version 3.5. Oui, le wrapper Winforms a fait obtenir la mise à niveau et montre la version Vista. Dans la classe System.Windows.Forms.OpenFileDialog, vous devrez ajouter une référence à System.Windows.Forms.

18 votes

Je pense que le point est que l'OpenFileDialog ne peut pas être utilisé pour sélectionner un dossier.

1voto

Euphoric Points 7641

Seul ce dialogue est FileDialog . Il fait partie de WinForms, mais il n'est en fait qu'une enveloppe autour de la boîte de dialogue de fichier standard de WinAPI. Et je ne pense pas qu'il soit laid, il fait en fait partie de l'OS, donc il ressemble à l'OS sur lequel il est exécuté.

Dans le cas contraire, il n'y a rien à faire pour vous aider. Vous devez soit chercher une implémentation tierce, gratuite (et je ne pense pas qu'il y en ait de bonnes) ou payante.

0 votes

Merci ! C'est, de loin, la meilleure réponse. Très simple à coder, que ce soit pour MVVM ou pour Windows standard.

4 votes

Mais cela ne vous permet pas de choisir un dossier... ce qui est le but de la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X