TreeViewのノードがタップされたら展開する
いまはまだルートフォルダーしか表示されていません。ノードの「>」マークがタップされたら、その直下にあるフォルダー/ファイルが展開されるようにしましょう。
Expandingイベント
ユーザーがノードを展開する操作(ノードの「>」マークをクリックするなど)を行うと、あるいは、コードからノードを展開する指示を出すと、TreeViewコントロールでExpandingイベントが発生します。そこで、次のコードのようにしてExpandingイベントハンドラーを追加します。
<TreeView x:Name="TreeView1" SelectionMode="Single"
Expanding="TreeView1_Expanding"
/>
HasUnrealizedChildrenプロパティの意味
Expandingイベントハンドラーでは、ノードのHasUnrealizedChildrenプロパティを見て処理を分岐させます。
HasUnrealizedChildrenプロパティがtrueのとき、ノードを展開する「>」マークが無条件に表示され、必ず展開操作が受け付けられます。今回のExpandingイベントハンドラーでは、trueのときは配下のフォルダー/ファイルの検索をまだやっていないものとして、検索を実行することにします。
falseのときは、「>」マークの表示は、実際に子ノードを持っているかどうかで決まります。子ノードが実際に存在するときは、「>」マークが表示されて展開操作が受け付けられます。子ノードが実際に存在しないときは、「>」マークは表示されず、展開操作も受け付けられません。今回のExpandingイベントハンドラーでは、検索済みであるとして、もう何もしないようにします。
フォルダーの場合、その中にフォルダー/ファイルが存在する可能性がありますから、ノードを追加するときにHasUnrealizedChildrenプロパティをtrueに設定しました(「ルートフォルダーを取得してTreeViewコントロールに追加する」の項)。この後、Expandingイベントハンドラーで、フォルダー配下のフォルダー/ファイルを実際に検索したら、falseに切り替えるようにします(「>」マークの表示は、子ノードの有無に従うようになります)。
ファイルの場合、子ノードは持てません。この後のコードで、ファイルのノードを追加するときには、HasUnrealizedChildrenプロパティを最初からfalseに設定します(「>」マークを表示しません)。
Expandingイベントハンドラーの処理
Expandingイベントハンドラーでは、展開されるノードの配下をまだ検索していなければ、検索を実行して子ノードを追加します。追加するノードのHasUnrealizedChildrenプロパティは、それがフォルダーならtrueに、ファイルならfalseにセットします。検索を実行したら、展開されるノード自体のHasUnrealizedChildrenプロパティはfalseにします(次のコード)。
private async void TreeView1_Expanding(TreeView sender, TreeViewExpandingEventArgs args)
{
bool searched = !args.Node.HasUnrealizedChildren;
if (searched) // 検索済みなら何もしない
return;
try
{
var folder = args.Node.Content as StorageFolder;
// フォルダー配下のIStorageItemオブジェクトを検索する
var items = await folder.GetItemsAsync();
// 見つかったIStorageItemオブジェクトをノードに追加する
foreach (var storageItem in items)
args.Node.Children.Add(new TreeViewNode()
{
IsExpanded = false,
Content = storageItem,
HasUnrealizedChildren = storageItem is StorageFolder,
});
}
finally
{
// 検索を実行したので、必ずHasUnrealizedChildrenはfalseにする
args.Node.HasUnrealizedChildren = false;
}
}
これで、ルートフォルダーからどんどんとフォルダーを展開していけるようになりました(次の画像)。ファイルもちゃんと表示されています。
ノードの「>」マークをクリックすると、そのノードが展開されます。そこに子ノードが存在すれば、それらが表示されるとともに、展開したノードのマークが「v」に変わります。そこに子ノードが存在しなかったときは、展開したノードのマークが消えます。
