WPF でファイルを選択するダイアログボックスとフォルダーを選択するダイアログボックスを表示する方法についてです。
目次
ファイル選択ダイアログを表示する (OpenFileDialog, SaveFileDialog)
WPF でファイルを選択するダイアログ (「ファイルを開くダイアログ」「名前を付けて保存ダイアログ」) を表示する場合は Microsoft.Win32 名前空間にある OpenFileDialog クラスと SaveFileDialog クラスを使います。
使い方は System.Windows.Forms 名前空間にある Windows フォームの OpenFileDialog, SaveFileDialog とほとんど同じです。
WPF でファイル選択ダイアログを表示するサンプル
以下のサンプルではメインウィンドウに配置した2つのボタンからそれぞれのダイアログを表示して、選択されたファイル名 (ファイルパス) をメッセージボックスに表示させています。
画面イメージ
XAML ソース
1 2 3 4 5 6 7 8 9 |
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="116" Width="300"> <Grid> <Button Content="ファイルを開くダイアログボックス" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="256" Click="button1_Click" Grid.ColumnSpan="2" /> <Button Content="名前を付けて保存ダイアログボックス" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button2" VerticalAlignment="Top" Width="256" Click="button2_Click" Grid.ColumnSpan="2" /> </Grid> </Window> |
コードビハインド C# ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; // ファイル選択ダイアログの名前空間を using using Microsoft.Win32; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// ファイルを開くダイアログボックスを表示 /// </summary> private void button1_Click(object sender, RoutedEventArgs e) { // ダイアログのインスタンスを生成 var dialog = new OpenFileDialog(); // ファイルの種類を設定 dialog.Filter = "テキストファイル (*.txt)|*.txt|全てのファイル (*.*)|*.*"; // ダイアログを表示する if (dialog.ShowDialog() == true) { // 選択されたファイル名 (ファイルパス) をメッセージボックスに表示 MessageBox.Show(dialog.FileName); } } /// <summary> /// 名前を付けて保存ダイアログボックスを表示 /// </summary> private void button2_Click(object sender, RoutedEventArgs e) { // ダイアログのインスタンスを生成 var dialog = new SaveFileDialog(); // ファイルの種類を設定 dialog.Filter = "テキストファイル (*.txt)|*.txt|全てのファイル (*.*)|*.*"; // ダイアログを表示する if (dialog.ShowDialog() == true) { // 選択されたファイル名 (ファイルパス) をメッセージボックスに表示 MessageBox.Show(dialog.FileName); } } } } |
フォルダー選択ダイアログを表示する (FolderBrowserDialog)
フォルダー参照ダイアログは残念ながら Microsoft.Win32 名前空間に存在しないので System.Windows.Forms.dll への参照を追加して使います。(Windows フォーム と同じ)
WPF でフォルダー選択ダイアログを表示するサンプル
以下のサンプルではファイル選択ダイアログの時と同様に、メインウィンドウに配置したボタンからダイアログを表示して、選択されたファイル名 (ファイルパス) をメッセージボックスに表示させています。
画面イメージ
XAML ソース
1 2 3 4 5 6 7 8 |
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="88" Width="300"> <Grid> <Button Content="フォルダー参照ダイアログボックス" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="256" Click="button1_Click" /> </Grid> </Window> |
コードビハインド C# ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; // フォルダー選択ダイアログの名前空間を using using Forms = System.Windows.Forms; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// フォルダー参照ダイアログボックスを表示 /// </summary> private void button1_Click(object sender, RoutedEventArgs e) { // フォルダー参照ダイアログのインスタンスを生成 var dlg = new Forms.FolderBrowserDialog(); // 説明文を設定 dlg.Description = "フォルダーを選択してください。"; // ダイアログを表示 if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // 選択されたフォルダーパスをメッセージボックスに表示 MessageBox.Show(dlg.SelectedPath); } } } } |
Windows API Code Pack を利用してダイアログボックスを表示する
Windows API Code Pack を使うことで、WPF でファイルを選択するダイアログとフォルダーを選択するダイアログを表示することもできます。
Windows API Code Pack は、以下のサイトからダウンロードできます。
Windows API Code Pack for Microsoft .NET Framework 概要
※ 残念ながら現在では、上記のサイトからのダウンロードはできなくなっていました。
代わりに NuGet からインストールできるので、NuGet でインストールします。
ファイルを選択するダイアログ
ファイルを選択するダイアログを表示するには、Microsoft.WindowsAPICodePack.dll と Microsoft.WindowsAPICodePack.Shell.dll が必要なので、両 DLL への参照を追加します。
ファイルを選択するダイアログのクラスは Microsoft.WindowsAPICodePack.Dialogs 名前空間にあります。
ファイルを開くダイアログを表示する場合は CommonOpenFileDialog クラスを、名前を付けて保存ダイアログを表示する場合は CommonSaveFileDialog クラスをそれぞれ使います。
ダイアログのファイルの種類の設定
Microsoft.Win32 名前空間のダイアログと System.Windows.Forms 名前空間のダイアログでは、ファイルの種類を Filter プロパティに文字列で設定しますが Microsoft.WindowsAPICodePack.Dialogs 名前空間のダイアログには Filter プロパティがありません。
代わりに Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogFilterCollection 型の Filters というプロパティが用意されていて、以下のように設定します。
1 2 3 4 5 6 |
// ダイアログのインスタンスを生成 var dialog = new CommonOpenFileDialog(); // ファイルの種類1 (1つのファイルに拡張子が1つの場合) dialog.Filters.Add(new CommonFileDialogFilter("テキストファイル", "*.txt")); // ファイルの種類2 (1つのファイルに拡張子が2つの場合) dialog.Filters.Add(new CommonFileDialogFilter("HTML ファイル", "*.html;*.htm")); |
ちなみに、以下のように CommonFileDialogFilter クラスのインスタンスを生成して DisplayName プロパティに「ファイルの説明」、Extensions プロパティに「ファイルのパターン (拡張子) 」を設定することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// ダイアログのインスタンスを生成 var dialog = new CommonSaveFileDialog(); // ファイルの種類1 (1つのファイルに拡張子が1つの場合) CommonFileDialogFilter filter1 = new CommonFileDialogFilter(); filter1.DisplayName = "テキストファイル"; filter1.Extensions.Add("txt"); dialog.Filters.Add(filter1); // ファイルの種類2 (1つのファイルに拡張子が2つの場合) CommonFileDialogFilter filter2 = new CommonFileDialogFilter(); filter2.DisplayName = "HTML ファイル"; filter2.Extensions.Add("html"); filter2.Extensions.Add("htm"); dialog.Filters.Add(filter2); |
ダイアログのタイトルの設定
ダイアログのタイトルは、Microsoft.Win32 名前空間のダイアログや System.Windows.Forms 名前空間のダイアログと同じように Title プロパティで設定できますが Microsoft.WindowsAPICodePack.Dialogs 名前空間のダイアログでは、コンストラクタの引数にタイトルを指定することも可能です。
1 2 3 4 |
// ファイルを開くダイアログのインスタンスを生成 var dialog = new CommonOpenFileDialog("ファイルを開く"); // 名前を付けて保存ダイアログのインスタンスを生成 var dialog = new CommonSaveFileDialog("名前を付けて保存"); |
フォルダーを選択するダイアログ
Microsoft.WindowsAPICodePack.Dialogs 名前空間には、フォルダーを選択する専用のクラスがありません。
代わりに、CommonOpenFileDialog クラスを使うことになります。
CommonOpenFileDialog クラスに用意されている IsFolderPicker プロパティを true に設定することで、ファイルではなくフォルダーを選択できるようになります。
ファイルを開くダイアログと見た目はほとんど変わりませんが、リストビューにファイルが表示されなくなり [開く] ボタンが [フォルダーの選択] に替わります。
WPF で Windows API Code Pack のダイアログを表示するサンプル
以下のサンプルではメインウィンドウに配置した3つのボタンからそれぞれのダイアログを表示して、選択されたファイル名 (ファイルパス) or フォルダーパスをメッセージボックスに表示させています。
画面イメージ
XAML ソース
1 2 3 4 5 6 7 8 9 10 |
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="149" Width="300"> <Grid> <Button Content="ファイルを開くダイアログボックス" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="256" Click="button1_Click" /> <Button Content="名前を付けて保存ダイアログボックス" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button2" VerticalAlignment="Top" Width="256" Click="button2_Click" /> <Button Content="フォルダー参照ダイアログボックス" Height="23" HorizontalAlignment="Left" Margin="12,70,0,0" Name="button3" VerticalAlignment="Top" Width="256" Click="button3_Click" /> </Grid> </Window> |
コードビハインド C# ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; // Windows API Code Pack のダイアログの名前空間を using using Microsoft.WindowsAPICodePack.Dialogs; namespace WpfApplication1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } // ファイルを開くダイアログボックスを表示 private void button1_Click(object sender, RoutedEventArgs e) { // ダイアログのインスタンスを生成 var dialog = new CommonOpenFileDialog("ファイルを開く"); // ファイルの種類を設定 dialog.Filters.Add(new CommonFileDialogFilter("HTML ファイル", "*.html;*.htm")); dialog.Filters.Add(new CommonFileDialogFilter("テキストファイル", "*.txt")); dialog.Filters.Add(new CommonFileDialogFilter("全てのファイル", "*.*")); // ダイアログを表示 if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { MessageBox.Show(dialog.FileName); } } // 名前を付けて保存ダイアログボックスを表示 private void button2_Click(object sender, RoutedEventArgs e) { // ダイアログのインスタンスを生成 var dialog = new CommonSaveFileDialog("名前を付けて保存"); // ファイルの種類を設定 dialog.Filters.Add(new CommonFileDialogFilter("HTML ファイル", "*.html;*.htm")); dialog.Filters.Add(new CommonFileDialogFilter("テキストファイル", "*.txt")); dialog.Filters.Add(new CommonFileDialogFilter("全てのファイル", "*.*")); // ダイアログを表示 if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { MessageBox.Show(dialog.FileName); } } // フォルダー参照ダイアログボックスを表示 private void button3_Click(object sender, RoutedEventArgs e) { // ダイアログのインスタンスを生成 var dialog = new CommonOpenFileDialog("フォルダーの選択"); // 選択形式をフォルダースタイルにする IsFolderPicker プロパティを設定 dialog.IsFolderPicker = true; // ダイアログを表示 if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { MessageBox.Show(dialog.FileName); } } } } |
上記の例では WPF からダイアログを表示しましたが、同じ様にすれば Windows フォームからも Windows API Code Pack を利用してダイアログを表示できます。
おまけ
Windows API Code Pack の CommonOpenFileDialog クラスと CommonSaveFileDialog クラスのプロパティの一覧を一応記載しておきます。
CommonOpenFileDialog のプロパティ
- AddToMostRecentlyUsedList
- AllowNonFileSystemItems
- AllowPropertyEditing
- Controls
- CookieIdentifier
- DefaultDirectory
- DefaultDirectoryShellContainer
- DefaultExtension
- DefaultFileName
- EnsureFileExists
- EnsurePathExists
- EnsureReadOnly
- EnsureValidNames
- FileAsShellObject
- FileName
- FileNames
- FilesAsShellObject
- Filters
- InitialDirectory
- InitialDirectoryShellContainer
- IsFolderPicker
- Multiselect
- NavigateToShortcut
- RestoreDirectory
- SelectedFileTypeIndex
- ShowHiddenItems
- ShowPlacesList
- Title
CommonSaveFileDialog のプロパティ
- AddToMostRecentlyUsedList
- AllowPropertyEditing
- AlwaysAppendDefaultExtension
- CollectedProperties
- Controls
- CookieIdentifier
- CreatePrompt
- DefaultDirectory
- DefaultDirectoryShellContainer
- DefaultExtension
- DefaultFileName
- EnsureFileExists
- EnsurePathExists
- EnsureReadOnly
- EnsureValidNames
- FileAsShellObject
- FileName
- Filters
- InitialDirectory
- InitialDirectoryShellContainer
- IsExpandedMode
- NavigateToShortcut
- OverwritePrompt
- RestoreDirectory
- SelectedFileTypeIndex
- ShowHiddenItems
- ShowPlacesList
- Title
ご参考までに