Boîte de dialog Sélectionner un 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 stockera quelque chose (fichiers, rapports générés, etc.).

Mes exigences:

Si je comprends bien, jusqu’en 2010 (.Net 4.0), il n’y aura pas de boîte de dialog de dossier standard, mais peut-être y a-t-il des changements dans la version 4.0?

Ou tout ce qu’il rest à faire est d’utiliser le dialog WinForms old-school? Si c’est le seul moyen de faire ce dont j’ai besoin, comment puis-je le rapprocher du style Vista / 7 et non de Win9x?

Sur certains forums, j’ai vu l’implémentation de tels dialogs, mais avec d’anciennes icons laides à la Windows 95. Ça n’a vraiment pas l’air sympa.

J’ai écrit à ce sujet sur mon blog il y a longtemps, le support de WPF pour les dialogs de fichiers courants est vraiment mauvais (ou du moins en 3.5 je n’ai pas vérifié dans la version 4) – mais il est facile de le contourner.

Vous devez append le manifeste correct à votre application – cela vous donnera un navigateur de boîtes de message et de dossiers de style moderne (WinForms FolderBrowserDialog) mais pas de boîtes de dialog d’ouverture / enregistrement de fichiers WPF. à propos de l’explication et ne veulent que la solution aller directement au 3ème):

  • Pourquoi est-ce que j’obtiens des boîtes de dialog et des boîtes de message de style ancien avec WPF?
  • Définir un manifeste résoudra-t-il mes problèmes de style de boîte de message WPF?
  • Le manifeste d’application requirejs pour les dialogs de fichiers de style XP et Vista et les boîtes de message avec WPF

Heureusement, les boîtes de dialog d’ouverture / de sauvegarde sont des enveloppes très fines autour de l’API Win32, faciles à appeler avec les indicateurs appropriés pour obtenir le style Vista / 7 (après avoir défini le manifeste).

  • Le style Vista ouvre et enregistre les dialogs avec WPF (sans utiliser l’exemple de pont de Vista)

Le Cookbook de Windows Presentation Foundation 4.5 par Pavel Yosifovich à la page 155 dans la section «Utilisation des boîtes de dialog communes» indique:

“Qu’en est-il de la sélection de dossier (au lieu de fichiers)? WPF OpenFileDialog ne le prend pas en charge. L’une des solutions consiste à utiliser la classe FolderBrowseDialog de Windows Forms.

J’ai téléchargé le pack de code API à partir du pack de code de l’API Windows® pour Microsoft® .NET Framework Pack de code API Windows: où est-il? puis 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 ssortingng } 

Microsoft.Win32.OpenFileDialog est la boîte de dialog standard utilisée par toute application sous Windows. Votre utilisateur ne sera pas surpris par son apparence lorsque vous utilisez WPF dans .NET 4.0

La boîte de dialog a été modifiée dans Vista. WPF dans .NET 3.0 et 3.5 utilisait toujours la boîte de dialog héritée, mais celle-ci avait été corrigée dans .NET 4.0. Je ne peux que deviner que vous avez démarré ce fil parce que vous voyez ce vieux dialog. Ce qui signifie probablement que vous exécutez un programme ciblant 3.5. Oui, le wrapper Winforms a obtenu la mise à niveau et affiche la version de Vista. Classe System.Windows.Forms.OpenFileDialog, vous devrez append une référence à System.Windows.Forms.

MVVM + WinForms FolderBrowserDialog comme comportement

 public class FolderDialogBehavior : Behavior 

Usage

   

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

Ajouter le code pack-API Windows à votre projet

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

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, qui ne fonctionnent pas dans l’original. De plus, dans ma version ajustée, la boîte de dialog affiche le dossier initial.

Utilisation dans XAML:

  

Code:

 using System.Windows; using System.Windows.Forms; using System.Windows.Interactivity; using Button = System.Windows.Controls.Button; public class FolderDialogBehavior : Behavior 

Si vous ne souhaitez pas utiliser Windows Forms ni éditer les fichiers de manifeste, j’ai proposé un hack très simple en utilisant la boîte de dialog SaveAs de WPF pour sélectionner un répertoire.

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.

Seul un tel dialog est FileDialog . Cela fait partie de WinForms, mais en fait, il ne fait qu’environner la boîte de dialog standard des fichiers OS WinAPI. Et je ne pense pas que ce soit moche, c’est en fait une partie du système d’exploitation, donc il semble que le système d’exploitation soit exécuté.

Autrement, il n’y a rien pour vous aider. Vous devez soit rechercher une implémentation tierce, gratuite (et je ne pense pas qu’il y en ait de bon) ou payante.