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:
Possibilité de voir l’arborescence de dossiers standard
Possibilité de sélectionner un dossier
Apparence de WPF, cette boîte de dialog doit ressembler à une application moderne conçue pour Windows Vista / 7 et non pour Windows 2000 ou même Win9x.
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):
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 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:
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.