LoginSignup
9
12

More than 5 years have passed since last update.

wpfでvsのフォルダ選択ダイアログみたいなダイアログを表示したい

Posted at

はじめに

wpf の OpenFileDialog にフォルダ選択モードがない。

一方、IFileDialog (native) のオプションには、 FOS_PICKFOLDERS というフォルダを選択するモードがある。
ReferenceSourceを覗くと、wpfの実装はIFileDialog(利用できれば)を利用しているけれど、このフラグに該当するプロパティ等が実装していない。
自作しないといけないかと思ったら、Api code pack にはその実装があったのでメモ。

利用手順

  1. api code pack を利用する。 nuget から WindowsAPICodePack-Shell を探してインストール。 複数見つかるけど、自分は aybeさんバージョンを利用した。オリジナルコードにも同じプロパティがあるのでどのバージョンでも動作しそう(未確認)
  2. Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog インスタンスをnewする。
  3. CommonOpenFileDialog.IsFolderPicker プロパティをtrueにする。
  4. 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)

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12