2017-02-03 21 views
0

在我的Window我有TreeViewTreeView.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(); 
    } 
}