2017-02-03 19 views
0

私のWindowにはTreeViewがあります。 TreeView.ItemsSourceは私のデータ(階層データ構造)にバインドされています。現在のスクロールバーの位置の一番下にあるTreeViewItemを展開すると、私のサブアイテムは非表示になり、スクロールして表示する必要があります。拡張アイテムのすべての副項目を表示する方法はありますか?展開したTreeViewItemのすべてのTreeViewItemを表示する方法

私はこれを試してみましたが、うまくいきませんでした:

public void TreeViewItem_Expanded(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem tvi = e.OriginalSource as TreeViewItem; 
    if (tvi != null) 
    { 
     Debug.WriteLine("TreeNode '{0}' was expanded", tvi.Header); 
     tvi.BringIntoView(); 
    } 
} 

答えて

0

基本的には、最後のサブ項目を選択し、アイテムが展開されたときのビューにそれを持って来ます。サブアイテムがない場合は、アイテム自体を表示します。

イベントが実行されたときにサブアイテムが必ずしも利用可能であるとは限りませんので、ItemContainerGenerator.Statusをチェックし、まだ完了していない場合はItemContainerGenerator.StatusChangedイベントにサブスクライブしてください。

次のコードは静的なアイテムでのみテストされていますが、動的なデータソースで問題が発生する場合は、いくつかの詳細を再確認する必要があります。

void TreeViewItem_Expanded(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem tvi = e.OriginalSource as TreeViewItem; 
    if (tvi != null) 
    { 
     if (tvi.HasItems) 
     { 
      if (tvi.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
      { 
       BringLastItemIntoView(tvi.ItemContainerGenerator); 
      } 
      else 
      { 
       tvi.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; 
      } 
     } 
     else 
     { 
      tvi.BringIntoView(); 
     } 
    } 
} 

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) 
{ 
    var s = sender as ItemContainerGenerator; 
    if (s.Status == GeneratorStatus.ContainersGenerated) 
    { 
     BringLastItemIntoView(s); 
     s.StatusChanged -= ItemContainerGenerator_StatusChanged; 
    } 
} 

void BringLastItemIntoView(ItemContainerGenerator generator) 
{ 
    var tvi = generator.ContainerFromItem(generator.Items.LastOrDefault()) as TreeViewItem; 
    if (tvi != null) 
    { 
     tvi.BringIntoView(); 
    } 
} 
関連する問題