2017-02-03 3 views
0

На моем Window у меня есть TreeView. TreeView.ItemsSource привязан к моим данным (иерархическая структура данных). Когда я расширяю TreeViewItem, который находится внизу текущей позиции полосы прокрутки, мои подэлементы скрыты, и я должен прокрутить их, чтобы увидеть их. Есть ли способ показать все подэлементы расширенного элемента?Как привести в действие все TreeViewItems расширенного 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(); 
    } 
} 
Смежные вопросы