2009-05-07 12 views

Odpowiedz

7

Klasa TreeView WPF nie ma metody ExpandAll. W ten sposób będziesz musiał przechodzić przez węzły i ustawić ich właściwości IsExpanded na true.

64

To może pomóc

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+1

Proste i skuteczne! Dzięki! – StinkyCat

+3

OK, ale to rozwiązanie jest w czasie ładowania, a nie na żądanie. – Ahmad

15

z XAML stylu TreeView trzeba mieć właściwość setter takiego co napisałem powyżej:

W pliku CS, napisać metod, takich jak ten, w moim próbki i użyłem przycisku, a nazwa mojego drzewa to myTV:

private void ExpandAll(ItemsControl items, bool expand) 
    { 
     foreach (object obj in items.Items) 
     { 
      ItemsControl childControl = items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl; 
      if (childControl != null) 
      { 
       ExpandAll(childControl, expand); 
      } 
      TreeViewItem item = childControl as TreeViewItem; 
      if (item != null) 
       item.IsExpanded = true; 
     } 
    } 


    private void btnExpandAll_Click(object sender, RoutedEventArgs e) 
    { 

     foreach (object item in this.myTV.Items) 
     { 
      TreeViewItem treeItem = this.myTV.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; 
      if (treeItem != null) 
       ExpandAll(treeItem, true); 
      treeItem.IsExpanded = true; 
     } 
    } 

mam nadzieję, że ci to pomoże.

1

Oprócz komentarza user2779123 i wiem, że już dawno temu udzielono odpowiedzi, ale sugerowałbym również, aby kod Pierre-Oliviera Pignona pchnął drzewoItem.IsExpanded = true; nie tylko zostanie przeniesiony do zakresu kontroli zerowej, ale także przeniesiony do procedury ExpandAll, ponieważ wydaje się, że jest napisany w formacie, który pozwala zarówno na rozbudowę, jak i na zwijanie struktury drzewa, a przeniesienie jej tam spowoduje dodanie węzłów głównych do tego funkcjonalność według projektu.

Jak na poniższym przykładzie:

private void ExpandAll(ItemsControl items, bool expand) 
{ 
    items.IsExpanded = expand; 
    foreach (object obj in items.Items) 
    { 
     ItemsControl childControl = items.ItemContainerGenerator.ContainerFromItem(obj) as ItemsControl; 
     if (childControl != null) 
     { 
      ExpandAll(childControl, expand); 
     } 
     TreeViewItem item = childControl as TreeViewItem; 
     if (item != null) 
      item.IsExpanded = true; 
    } 
} 


private void btnExpandAll_Click(object sender, RoutedEventArgs e) 
{ 

    foreach (object item in this.myTV.Items) 
    { 
     TreeViewItem treeItem = this.myTV.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; 
     if (treeItem != null) 
      ExpandAll(treeItem, true); 
    } 
} 
+0

ItemsControl nie ma .IsExpanded, ale TreeViewItem ma. – Tomas

0

Odpowiedź udzielana przez @ Pierre-Olivier jest dobry.

Osobiście wolę używać stosu zamiast rekursji w takich okolicznościach, w których nie masz pojęcia, jak głęboko mogą być zagnieżdżone dane. Jeszcze lepiej, to może być dostarczony jako funkcję przedłużacza:

public static void ExpandAll(this TreeViewItem treeViewItem, bool isExpanded = true) 
{ 
    var stack = new Stack<TreeViewItem>(treeViewItem.Items.Cast<TreeViewItem>()); 
    while(stack.Count > 0) 
    { 
     TreeViewItem item = stack.Pop(); 

     foreach(var child in item.Items) 
     { 
      var childContainer = child as TreeViewItem; 
      if(childContainer == null) 
      { 
       childContainer = item.ItemContainerGenerator.ContainerFromItem(child) as TreeViewItem; 
      } 

      stack.Push(childContainer); 
     } 

     item.IsExpanded = isExpanded; 
    } 
} 

public static void CollapseAll(this TreeViewItem treeViewItem) 
{ 
    treeViewItem.ExpandAll(false); 
} 
-1
/// <summary> 
    /// Collapse the TreeView. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void _collapseTreeView_button_Click(object sender, RoutedEventArgs e) 
    { 
     _ordersParentChild_TreeView.UpdateLayout(); 
     if (_ordersParentChild_TreeView.Items.Count > 0) 
     { 
      var rootTreeViewItem = _ordersParentChild_TreeView.Items[0] as TreeViewItem; 
      if (rootTreeViewItem != null) 
      { 
       rootTreeViewItem.IsExpanded = false; 
      } 
     } 
    } 
    /// <summary> 
    /// Expand the TreeView. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void _expandTreeView_button_Click(object sender, RoutedEventArgs e) 
    { 
     _ordersParentChild_TreeView.UpdateLayout(); 
     if(_ordersParentChild_TreeView.Items.Count > 0) 
     { 
      var rootTreeViewItem = _ordersParentChild_TreeView.Items[0] as TreeViewItem; 
      if (rootTreeViewItem != null) 
      { 
       rootTreeViewItem.ExpandSubtree(); 
      } 
     } 
    } 
} 
+0

Nie działa ... –

-1

spróbować

private void btnExpandAll_Click(object sender, RoutedEventArgs e) 
{ 
    foreach(var item in tvES.Items) 
    { 
     var tvi = item as TreeViewItem; 
     if (tvi != null) 
      tvi.ExpandSubtree(); 
    } 
} 
Powiązane problemy