2017-02-03 1 views
0

in Sicht bringt Auf meinem Window habe ich TreeView. TreeView.ItemsSource ist an meine Daten gebunden (hierarchische Datenstruktur). Wenn ich einige TreeViewItem, die auf der Unterseite der aktuellen Scrollbar-Position ist, erweitern, sind meine Unterelemente ausgeblendet und ich muss scrollen, um sie zu sehen. Gibt es eine Möglichkeit, alle Unterelemente des erweiterten Elements anzuzeigen?Wie man alle TreeViewItems von erweitertem TreeViewItem

Ich habe dies versucht, aber hat nicht funktioniert:

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(); 
    } 
} 

Antwort

0

Grundsätzlich wählen Sie den letzten Unterpunkt und es in den Blick bringen, wenn ein Element erweitert wird. Wenn es keine Unterelemente hat, bringe das Objekt selbst in Sicht.

Der schwierige Teil ist, Unterpunkte sind nicht unbedingt verfügbar, wenn das Ereignis ausgeführt wird, so schlage ich vor, überprüfen Sie die ItemContainerGenerator.Status und wenn es noch nicht geschehen ist, abonnieren Sie die ItemContainerGenerator.StatusChanged Veranstaltung.

Der folgende Code wird nur mit statischen Elementen getestet. Wenn Probleme bei dynamischen Datenquellen auftreten, muss ich eventuell einige Details überprüfen.

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(); 
    } 
} 
Verwandte Themen