using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Media; using System.Windows; using System.ComponentModel; namespace HMI.UI { public class TreeViewHelper { public static bool GetAutoExpand(TreeView treeView) { return (bool)treeView.GetValue(AutoExpandProperty); } public static void SetAutoExpand(TreeView treeView, bool value) { treeView.SetValue(AutoExpandProperty, value); } public static readonly DependencyProperty AutoExpandProperty = DependencyProperty.RegisterAttached("AutoExpand", typeof(bool), typeof(TreeViewHelper), new PropertyMetadata(false, (d, e) => { if (!(d is TreeView treeView)) return; if ((bool)e.NewValue) { var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid)); dpd?.AddValueChanged(treeView, TreeView_ItemSourceChanged); } else { var dpd = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(DataGrid)); dpd?.RemoveValueChanged(treeView, TreeView_ItemSourceChanged); } })); private static void TreeView_ItemSourceChanged(object sender, EventArgs e) { TreeView tree = sender as TreeView; if (!tree.IsLoaded) { tree.Loaded += Tree_Loaded; } else { ExpandAll(tree); } } private static void Tree_Loaded(object sender, RoutedEventArgs e) { TreeView tree = sender as TreeView; ExpandAll(tree); tree.Loaded -= Tree_Loaded; } public static void ExpandAll(TreeView treeView) { foreach (var item in treeView.Items) { var temp = treeView.ItemContainerGenerator.ContainerFromItem(item); if (temp is TreeViewItem treeViewItem) { ExpandTreeViewItem(treeViewItem); } } } public static void ExpandTreeViewItem(TreeViewItem item) { item.IsExpanded = true; // 确保子项已经生成 item.ApplyTemplate(); if (item.Items.Count > 0) { foreach (var subItem in item.Items) { if (item.ItemContainerGenerator.ContainerFromItem(subItem) is TreeViewItem childItem) { ExpandTreeViewItem(childItem); } } } } } }