Last Updated 2012/12/11
フォルダを選択するコントロールを作ってみました。ダイアログボックスではなく、UserControl です。したがって、フォームに貼り付けて使用することができます。
また、このコントロールの拡張例として、チェックボックス付きフォルダ選択ダイアログボックスを作りました。
フォルダを選択するダイアログボックスとして、System.Windows.Forms.FolderBrowserDialog クラスがあります。しかし、WPF のほうにはありません。もちろん、WPF アプリケーションであっても FolderBrowserDialog クラスを使えばいいのですが、どこかスッキリしません。そこで、作ってみました。
実用上は FolderBrowserDialog クラスであってもすごく困るということはないのですが、フォーム(ウインドウ)に貼り付けるコントロールにしたかったので、UserControl として作りました。UserControl ですからフォームに貼り付けてダイアログボックスのような使い方もできます。
なお、Windows シェル関係の COM オブジェクトを操作するのではなく、あくまで WPF 的に作ることにしました。まず、テスト用アプリケーションの起動状況を下図に示します。
左上の部分が FolderBrowser コントロール、下は TextBox コントロールで、ディレクトリの一つを選択するとそのディレクトリ名を表示します(上図では c:\ を表示しています)。右は ListBox コントロールで、選択したディレクトリ内のファイルをリストアップします。
FolderBrowser コントロールは TreeView コントロールを使ってフォルダのツリー構造を表示しますが、親フォルダが持つ子フォルダの数が不定です。また、子フォルダのさらに下層のフォルダの有無と数を含めて確定していません。FolderBrowser コントロールのキモはこのあたりをどのように処理するかです。
具体的な手順はソースコードを見てもらうとして、FolderBrowser コントロールの特徴をリストアップしておきます。
ところで、コントロールをテストしていて気付いたのですが、ときどき動作が緩慢になることがあります。TreeViewItem の表示には VirtualizingStackPanelクラスを使っているのですが、これがどうもクセモノのようです。このあたりのことはブラックボックスになっているため、どうにもなりません。
次の ZIP ファイルはソースコードです。Visual Studio 2010 C# / WPF で作りました。フリーウエアですから自由に使ってください。
FolderBrowserTest.zip (22,693 bytes)
一度に複数のフォルダを選択したいことがあります。そこで、FolderBrowser コントロールを拡張し、各フォルダ名の横にチェックボックスを配置し、複数のフォルダを選択可能にしてみました。今回は、コントロールをフォーム内に内包することでダイアログボックスとして作成しました。下図は、ダイアログボックスとして表示したところです。
下図は、テスト用アプリケーションを起動したところです。[フォルダ選択ダイアログの表示] をクリックすると、上図のダイアログボックスが表示されます。選択したいフォルダにチェックを入れると、フォ−ム内のリストボックスにフォルダのフルパスをリストアップします。
チェックボックスにチェックを入れたフォルダのフルパスを SelectedPathList プロパティで返します。このプロパティは List<string> オブジェクトです。チェックを入れたフォルダの階層の上下にかかわらず、すべてを返します。というのは、アプリケーションが期待する機能をあらかじめ予想することができないからです。上の階層のフォルダにチェックを入れ、かつ下の階層のフォルダも選択したときの処理はアプリケーション側で対処してください
次の ZIP ファイルはテスト用アプリケーションを含めてすべてのソースファイルを含みます。Visual Studio 2010 C#/WPF で作りました。フリーウエアです。
FolderWithCheckBox.zip (25,667 bytes)
−以上−