2009-05-07 27 views

Trả lời

7

Lớp WPF TreeView không có phương thức ExpandAll. Vì vậy, bạn phải lặp qua các nút và thiết lập các thuộc tính IsExpanded của chúng thành true.

64

này có thể giúp

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

đơn giản và hiệu quả! Cảm ơn! – StinkyCat

+3

Ok, nhưng giải pháp này là thời gian tải thay vì theo yêu cầu. – Ahmad

15

với XAML Treeview phong cách bạn phải có một setter tài sản như những gì đã viết ở trên:

Trong file Cs, hãy viết các phương pháp như thế này, trong mẫu của tôi đã sử dụng nút và tên của treeview của tôi là 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; 
     } 
    } 

hy vọng nó có thể giúp bạn.

1

Ngoài nhận xét của người dùng2779123 và tôi biết điều này đã được trả lời từ lâu nhưng tôi cũng khuyên rằng mã của Pierre-Olivier Pignon đẩy treeItem.IsExpanded = true; không chỉ được di chuyển vào phạm vi của kiểm tra null mà bằng cách di chuyển nó đến quy trình ExpandAll vì nó có vẻ được viết theo định dạng cho phép mở rộng và thu hẹp cấu trúc cây và di chuyển đến đó sẽ thêm các nút gốc vào chức năng theo thiết kế.

Theo ví dụ dưới đây:

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 không có .IsExpanded, nhưng TreeViewItem có. – Tomas

0

Câu trả lời được cung cấp bởi @ Pierre-Olivier là một tốt nhất.

Cá nhân, tôi thích sử dụng ngăn xếp hơn là đệ quy trong các trường hợp như thế này, nơi bạn không biết có thể lồng sâu dữ liệu vào đâu. Thậm chí tốt hơn, nó có thể được cung cấp như là một chức năng mở rộng:

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

Không hoạt động ... –

-1

thử này

private void btnExpandAll_Click(object sender, RoutedEventArgs e) 
{ 
    foreach(var item in tvES.Items) 
    { 
     var tvi = item as TreeViewItem; 
     if (tvi != null) 
      tvi.ExpandSubtree(); 
    } 
} 
Các vấn đề liên quan