Est-ce que WPF a un dialog de fichier natif?

Sous System.Windows.Controls , je peux voir un PrintDialog Cependant, je n’arrive pas à trouver un FileDialog natif. Dois-je créer une référence à System.Windows.Forms ou existe-t-il un autre moyen?

WPF a des dialogs de fichiers intégrés (mais pas natifs ). Plus précisément, ils se trouvent dans l’espace de noms Microsoft.Win32 légèrement inattendu (bien que faisant toujours partie de WPF). Voir les classes OpenFileDialog et SaveFileDialog en particulier.

Notez toutefois que ces classes ne sont que des wrappers autour de la fonctionnalité Win32, comme le suggère l’espace de noms parent. Cela signifie toutefois que vous n’avez pas besoin de faire d’interopérabilité WinForm ou Win32, ce qui le rend un peu plus agréable à utiliser. Malheureusement, les dialogs sont de style par défaut dans “l’ancien” thème Windows et vous avez besoin d’un petit hack dans app.manifest pour le forcer à utiliser le nouveau.

Vous pouvez créer une propriété attachée simple pour append cette fonctionnalité à une zone de texte. La boîte de dialog Ouvrir un fichier peut être utilisée comme ceci :

         

Le code pour OpenFileDialogEx:

 public class OpenFileDialogEx { public static readonly DependencyProperty FilterProperty = DependencyProperty.RegisterAttached("Filter", typeof (ssortingng), typeof (OpenFileDialogEx), new PropertyMetadata("All documents (.*)|*.*", (d, e) => AttachFileDialog((TextBox) d, e))); public static ssortingng GetFilter(UIElement element) { return (ssortingng)element.GetValue(FilterProperty); } public static void SetFilter(UIElement element, ssortingng value) { element.SetValue(FilterProperty, value); } private static void AttachFileDialog(TextBox textBox, DependencyPropertyChangedEventArgs args) { var parent = (Panel) textBox.Parent; parent.Loaded += delegate { var button = (Button) parent.Children.Cast().FirstOrDefault(x => x is Button); var filter = (ssortingng) args.NewValue; button.Click += (s, e) => { var dlg = new OpenFileDialog(); dlg.Filter = filter; var result = dlg.ShowDialog(); if (result == true) { textBox.Text = dlg.FileName; } }; }; } } 

J’ai utilisé la solution présentée par Gregor S. et cela fonctionne bien, même si j’ai dû le convertir en solution VB.NET, voici ma conversion si cela aide quelqu’un …

 Imports System Imports Microsoft.Win32 Public Class OpenFileDialogEx Public Shared ReadOnly FilterProperty As DependencyProperty = DependencyProperty.RegisterAttached("Filter", GetType(Ssortingng), GetType(OpenFileDialogEx), New PropertyMetadata("All documents (.*)|*.*", Sub(d, e) AttachFileDialog(DirectCast(d, TextBox), e))) Public Shared Function GetFilter(element As UIElement) As Ssortingng Return DirectCast(element.GetValue(FilterProperty), Ssortingng) End Function Public Shared Sub SetFilter(element As UIElement, value As Ssortingng) element.SetValue(FilterProperty, value) End Sub Private Shared Sub AttachFileDialog(textBox As TextBox, args As DependencyPropertyChangedEventArgs) Dim parent = DirectCast(textBox.Parent, Panel) AddHandler parent.Loaded, Sub() Dim button = DirectCast(parent.Children.Cast(Of Object)().FirstOrDefault(Function(x) TypeOf x Is Button), Button) Dim filter = DirectCast(args.NewValue, Ssortingng) AddHandler button.Click, Sub(s, e) Dim dlg = New OpenFileDialog() dlg.Filter = filter Dim result = dlg.ShowDialog() If result = True Then textBox.Text = dlg.FileName End If End Sub End Sub End Sub End Class 

Merci à Gregor S pour une solution soignée.

Dans Visual Studio 2010, le concepteur semble toutefois tomber en panne – donc j’ai modifié le code dans la classe OpenFileDialogEx. Le code XAML rest le même:

 public class OpenFileDialogEx { public static readonly DependencyProperty FilterProperty = DependencyProperty.RegisterAttached( "Filter", typeof(ssortingng), typeof(OpenFileDialogEx), new PropertyMetadata("All documents (.*)|*.*", (d, e) => AttachFileDialog((TextBox)d, e)) ); public static ssortingng GetFilter(UIElement element) { return (ssortingng)element.GetValue(FilterProperty); } public static void SetFilter(UIElement element, ssortingng value) { element.SetValue(FilterProperty, value); } private static void AttachFileDialog(TextBox textBox, DependencyPropertyChangedEventArgs args) { var textBoxParent = textBox.Parent as Panel; if (textBoxParent == null) { Debug.Print("Failed to attach File Dialog Launching Button Click Handler to Textbox parent panel!"); return; } textBoxParent.Loaded += delegate { var button = textBoxParent.Children.Cast().FirstOrDefault(x => x is Button) as Button; if (button == null) return; var filter = (ssortingng)args.NewValue; button.Click += (s, e) => { var dlg = new OpenFileDialog { Filter = filter }; var result = dlg.ShowDialog(); if (result == true) { textBox.Text = dlg.FileName; } }; }; } }