SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

UWPアプリでファイルマネージャーを作ろう!
~ついにWindows 10 1803で実現

UWPアプリ開発の最前線 第8回

TreeViewのノードがタップされたら展開する

 いまはまだルートフォルダーしか表示されていません。ノードの「>」マークがタップされたら、その直下にあるフォルダー/ファイルが展開されるようにしましょう。

Expandingイベント

 ユーザーがノードを展開する操作(ノードの「>」マークをクリックするなど)を行うと、あるいは、コードからノードを展開する指示を出すと、TreeViewコントロールでExpandingイベントが発生します。そこで、次のコードのようにしてExpandingイベントハンドラーを追加します。

TreeViewにExpandingイベントハンドラーを追加した(MainPage.xaml
<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にします(次のコード)。

TreeViewのExpandingイベントハンドラー(MainPage.xaml.cs
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;
  }
}

 これで、ルートフォルダーからどんどんとフォルダーを展開していけるようになりました(次の画像)。ファイルもちゃんと表示されています。

TreeViewのフォルダーノードを展開するとその子のフォルダー/ファイルが表示される
ノードのExpandingイベントで子ノードを追加するようにした

 ノードの「>」マークをクリックすると、そのノードが展開されます。そこに子ノードが存在すれば、それらが表示されるとともに、展開したノードのマークが「v」に変わります。そこに子ノードが存在しなかったときは、展開したノードのマークが消えます。

次のページ
フォルダー/ファイルが選択されたらその情報を表示する

関連リンク

この記事は参考になりましたか?

UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11072 2018/09/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー