はじめに
wpf の OpenFileDialog にフォルダ選択モードがない。
一方、IFileDialog (native) のオプションには、 FOS_PICKFOLDERS というフォルダを選択するモードがある。
ReferenceSourceを覗くと、wpfの実装はIFileDialog(利用できれば)を利用しているけれど、このフラグに該当するプロパティ等が実装していない。
自作しないといけないかと思ったら、Api code pack にはその実装があったのでメモ。
利用手順
- api code pack を利用する。
nuget から WindowsAPICodePack-Shell を探してインストール。
複数見つかるけど、自分は aybeさんバージョンを利用した。オリジナルコードにも同じプロパティがあるのでどのバージョンでも動作しそう(未確認) - Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog インスタンスをnewする。
- CommonOpenFileDialog.IsFolderPicker プロパティをtrueにする。
- ShowDialog()すると、フォルダ選択モードで動作する。
このとき、OKボタンの部分が、“開く”から“フォルダを選択”に変わっている。
実験コード
xaml画面
xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow"
Height="350"
Width="525">
<StackPanel>
<TextBox x:Name="SaveDirBox" />
<Button Click="SaveButton_OnClick">SaveButton</Button>
</StackPanel>
</Window>
コードビハインド
csharp
using System.Windows;
using Microsoft.WindowsAPICodePack.Dialogs;
namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void SaveButton_OnClick(object sender, RoutedEventArgs e)
{
var dlg = new CommonOpenFileDialog("保存フォルダ選択");
// フォルダ選択モード。
dlg.IsFolderPicker = true;
var ret = dlg.ShowDialog();
if (ret == CommonFileDialogResult.Ok)
{
this.SaveDirBox.Text = dlg.FileName;
}
}
}
}
参考
Select folder dialog WPF(stack overflow)
Windows-API-Code-Pack-1.1(github)