【问题标题】:CollapseAll items of a treeview within Wpf application折叠 Wpf 应用程序中树视图的所有项目
【发布时间】:2013-12-27 23:39:42
【问题描述】:

我有一个 WPF 应用程序,其中我有一个树视图控件。

我想通过单击一个按钮来折叠所有项目。我试过这个:

 private void buttonParam_Click(object sender, RoutedEventArgs e)
        {
//handling
    this.arborescence.IsExpanded = false;
        }

但它没有奏效。这个错误的原因是什么?如何更改我的 sn-p 来执行此任务?

【问题讨论】:

    标签: c# .net wpf treeview


    【解决方案1】:

    我认为最好的方法是遍历所有节点并将它们一个一个地折叠起来。

    private void cmdCollapse_Click(object sender, RoutedEventArgs e)
    {
        foreach (TreeViewItem item in treeview.Items)
            CollpaseTreeviewItems(item);
    }
    
    void CollapseTreeviewItems(TreeViewItem Item)
    {
        Item.IsExpanded = false;
    
        foreach (TreeViewItem item in Item.Items)
        {
            item.IsExpanded = false;
    
            if (item.HasItems)
                CollapseTreeviewItems(item);
        }
    }
    

    【讨论】:

      【解决方案2】:

      @JROs answer 在数据绑定到项目时不起作用,只有在将TreeViewItems 直接添加到TreeView 时才会起作用。

      我创建了这个扩展方法,它将在迭代中为当前对象检索匹配的TreeViewItem

      namespace System.Windows.Controls
      {
        using System.Linq;
        public static class TreeViewExtensions
        {
          public static void SetExpansion(this TreeView treeView, bool isExpanded) =>
            SetExpansion((ItemsControl)treeView, isExpanded);
      
          static void SetExpansion(ItemsControl parent, bool isExpanded)
          {
            if (parent is TreeViewItem tvi)
              tvi.IsExpanded = isExpanded;
      
            if (parent.HasItems)
              foreach (var item in parent.Items.Cast<object>()
            .Select(i => GetTreeViewItem(parent, i, isExpanded)))
                SetExpansion(item, isExpanded);
          }
      
          static TreeViewItem GetTreeViewItem(
            ItemsControl parent, object item, bool isExpanded)
          {
            if (item is TreeViewItem tvi)
              return tvi;
      
            var result = ContainerFromItem(parent, item);
            if (result == null && isExpanded)
            {
              parent.UpdateLayout();
              result = ContainerFromItem(parent, item);
            }
            return result;
          }
      
          static TreeViewItem ContainerFromItem(ItemsControl parent, object item) =>
            (TreeViewItem)parent.ItemContainerGenerator.ContainerFromItem(item);
        }
      }
      

      用法:

      treeView.SetExpansion(isExpanded: true / false);
      

      【讨论】:

        猜你喜欢
        • 2010-12-15
        • 1970-01-01
        • 2011-01-07
        • 2014-05-23
        • 2015-10-25
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多