Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialogクラス
下記の画像のようなファイル参照ダイアログのようなダイアログで、フォルダを参照する方法を説明します。

NuGetパッケージから「Windows API CodePack」をダウンロードして使用します。
「Windows API CodePack」は元々Microsoftが配布していたパッケージでしたが、現在リンク切れしており使えません。今回は有志がカスタマイズし再配布したものを利用します。
ライセンスは、Microsoftのライセンスと同様のものになっているので、再配布も可能のようです。
NuGetパッケージのダウンロード方法
1. NuGetパケットマネージャーを起動
プロジェクトを右クリックして、「NuGet パッケージを管理」を選択します。

2. 「WindowsAPICodePack-Shell」を検索し、インストールする
- ① 参照タブを選択します。
- ②「WindowsAPICodePack-Shell」と入力してください。
- ③ 検索結果にある「WindowsAPICodePack-Shell」を選択します。
- ④ 右のWindowに出てきた「インストール」をクリックします。

インストールをクリックすると以下の画面がでてきます。
「WindowsAPICodePack-Shell」を動作させるためには「WindowsAPICodePack-Core」が必要なので一緒にダウンロードされます。
「OK」をクリックしてください。

以下の画面が出てきたら「OK」を押してください。
「ライセンスの表示」を押してみましたがリンク切れしてました。
WindowsAPICodePack-Shellのライセンスはこちらに入れておきます。WindowsAPICodePack-Coreも同じライセンスです。

完了すると、プロジェクトの参照の中にダウンロードしたパッケージが入っています。

使用サンプル
ソースファイル(cppファイル)の先頭にusingを入れておきます。
using Microsoft.WindowsAPICodePack.Dialogs;
一番簡単にフォルダ参照ダイアログを表示するには以下のようにするとよいでしょう。
using (var dlg = new CommonOpenFileDialog())
{
// フォルダ選択ダイアログ(falseにするとファイル選択ダイアログ)
dlg.IsFolderPicker = true;
if (dlg.ShowDialog() == CommonFileDialogResult.Ok)
{
//開く以外を選択された場合はfalseを返す。
select_path = dlg.FileName;
}
}
CommonOpenFileDialogクラスはIDisposableインターフェースを継承しているのでusingを付けて使用後は解放することができます。もし宣言したファイル参照ダイアログクラスオブジェクトを再利用するということでなければusingを付けるべきだと考えます。
表示画面
OpenFileDialogではフォルダの中まで入らなければいけなかったのに対し、CommonOpenFileDialogではフォルダー選択して「フォルダーの選択」ボタンを押すだけで取得できます。


プロパティ
CommonOpenFileDialogクラスに用意されているプロパティを設定することで、ダイアログのタイトルなどいろんな設定ができるようになります。
以下に代表的になプロパティを紹介します。
| プロパティ名 | 説明 |
|---|---|
| Title | ダイアログに表示するタイトルを設定します。 |
| DefaultDirectory | 初期フォルダ名を設定します。 |
| Multiselect | 複数選択する場合は、「true」を選択します。 |
| IsFolderPicker | 「true」の場合はフォルダ選択、「false」の場合はファイル選択です。 |
こんな関数はいかがでしょうか?
フォルダ参照ダイアログの関数を作りました。
関数例
//ファイルの先頭行に追加
using Microsoft.WindowsAPICodePack.Dialogs;
/// <summary>
/// フォルダ参照ダイアログを呼び出してパスを取得する
/// </summary>
/// <param name="select_path">初期パス(in)/選択パス(out)</param>
/// <returns>true/false</returns>
private bool GetDirNameFromCommonOpenFileDialog(ref string select_path)
{
using (var dlg = new CommonOpenFileDialog())
{
// フォルダ選択ダイアログ(falseにするとファイル選択ダイアログ)
dlg.IsFolderPicker = true;
dlg.Title = "フォルダを選択してください。";
dlg.DefaultDirectory = select_path;
if (dlg.ShowDialog() != CommonFileDialogResult.Ok)
{
return false;
}
//開く以外を選択された場合はfalseを返す。
select_path = dlg.FileName;
}
return true;
}
使用例
private void btnSansyo_Click(object sender, EventArgs e)
{
//初期フォルダ名を設定する場合はここにセットする
string dir = this.DirNameTextbox.Text;
//フォルダ参照ダイアログを開く、キャンセルの場合は関数から抜ける
if (GetDirNameFromCommonOpenFileDialog(ref dir) == false) return;
//取得したフォルダ名をテキストボックスにセットする
this.DirNameTextbox.Text = dir;
}
実行結果

まとめ
フォルダ保存ダイアログを使ってダイアログを作成するときにこの記事が皆様のお役に立てたなら幸いです。


コメント