From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点
---
HMI.UI/Controls/treegrid/Controls/TreeGrid.cs | 396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 396 insertions(+), 0 deletions(-)
diff --git a/HMI.UI/Controls/treegrid/Controls/TreeGrid.cs b/HMI.UI/Controls/treegrid/Controls/TreeGrid.cs
new file mode 100644
index 0000000..b050336
--- /dev/null
+++ b/HMI.UI/Controls/treegrid/Controls/TreeGrid.cs
@@ -0,0 +1,396 @@
+锘�/*
+ * 涓昏鍙傝�冿細https://blog.csdn.net/lhx527099095/article/details/8061169/
+ */
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Media;
+
+namespace HMI.UI
+{
+ public class TreeGrid : TreeView
+ {
+ static TreeGrid()
+ {
+ //ScrollViewer.HorizontalScrollBarVisibilityProperty
+ // .OverrideMetadata(typeof(TreeDataGrid), new FrameworkPropertyMetadata(ScrollBarVisibility.Disabled));
+ //ScrollViewer.VerticalScrollBarVisibilityProperty
+ // .OverrideMetadata(typeof(TreeDataGrid), new FrameworkPropertyMetadata(ScrollBarVisibility.Disabled));
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeGrid), new FrameworkPropertyMetadata(typeof(TreeGrid)));
+ }
+
+ #region ColumnMappings DependencyProperty
+ public string ColumnMappings
+ {
+ get { return (string)GetValue(ColumnMappingsProperty); }
+ set { SetValue(ColumnMappingsProperty, value); }
+ }
+ public static readonly DependencyProperty ColumnMappingsProperty =
+ DependencyProperty.Register("ColumnMappings", typeof(string), typeof(TreeGrid),
+ new PropertyMetadata("", new PropertyChangedCallback(TreeGrid.OnColumnMappingsPropertyChanged)));
+
+ private static void OnColumnMappingsPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ if (obj is TreeGrid)
+ {
+ (obj as TreeGrid).OnColumnMappingsValueChanged();
+ }
+ }
+
+ protected void OnColumnMappingsValueChanged()
+ {
+ if (!string.IsNullOrEmpty(ColumnMappings))
+ {
+ ResetMappingColumns(ColumnMappings);
+ }
+ }
+
+ private void ResetMappingColumns(string mapping)
+ {
+ GridViewColumnCollection items = new GridViewColumnCollection();
+ var columns = mapping.Split(new char[] { ';', '|' }, StringSplitOptions.RemoveEmptyEntries);
+ foreach (var c in columns)
+ {
+ var index = c.IndexOf(':');
+ var title = "";
+ var name = "";
+ if (index > 0)
+ {
+ title = c.Substring(0, index);
+ name = c.Substring(index + 1);
+ }
+ else
+ {
+ title = c;
+ name = c;
+ }
+
+ DataTemplate temp = null;
+ var res = this.FindTreeResource<DataTemplate>(name);
+ if (res != null && res is DataTemplate template)
+ {
+ temp = template;
+ }
+ else
+ {
+ temp = new DataTemplate();
+ FrameworkElementFactory element = null;
+ if (items.Count == 0)
+ {
+ element = new FrameworkElementFactory(typeof(TreeItemContentControl));
+ element.SetValue(ContentControl.ContentProperty, new Binding(name));
+ }
+ else
+ {
+ element = new FrameworkElementFactory(typeof(TreeGridCell));
+ element.SetValue(ContentControl.ContentProperty, new Binding(name));
+ }
+ temp.VisualTree = element;
+ }
+ var col = new GridViewColumn
+ {
+ Header = title,
+ CellTemplate = temp,
+ };
+ items.Add(col);
+ }
+ Columns = items;
+ }
+ #endregion
+
+ #region Columns DependencyProperty
+ public GridViewColumnCollection Columns
+ {
+ get { return (GridViewColumnCollection)GetValue(ColumnsProperty); }
+ set { SetValue(ColumnsProperty, value); }
+ }
+ public static readonly DependencyProperty ColumnsProperty =
+ DependencyProperty.Register("Columns", typeof(GridViewColumnCollection), typeof(TreeGrid),
+ new PropertyMetadata(null, new PropertyChangedCallback(TreeGrid.OnColumnsPropertyChanged)));
+
+ private static void OnColumnsPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ if (obj is TreeGrid)
+ {
+ (obj as TreeGrid).OnColumnsValueChanged();
+ }
+ }
+
+ protected void OnColumnsValueChanged()
+ {
+
+ }
+ #endregion
+
+ #region RowHeight DependencyProperty
+ public double RowHeight
+ {
+ get { return (double)GetValue(RowHeightProperty); }
+ set { SetValue(RowHeightProperty, value); }
+ }
+ public static readonly DependencyProperty RowHeightProperty =
+ DependencyProperty.Register("RowHeight", typeof(double), typeof(TreeGrid),
+ new PropertyMetadata(30.0, new PropertyChangedCallback(TreeGrid.OnRowHeightPropertyChanged)));
+
+ private static void OnRowHeightPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ if (obj is TreeGrid)
+ {
+ (obj as TreeGrid).OnRowHeightValueChanged();
+ }
+ }
+
+ protected void OnRowHeightValueChanged()
+ {
+
+ }
+ #endregion
+
+ #region ShowCellBorder DependencyProperty
+ public bool ShowCellBorder
+ {
+ get { return (bool)GetValue(ShowCellBorderProperty); }
+ set { SetValue(ShowCellBorderProperty, value); }
+ }
+ public static readonly DependencyProperty ShowCellBorderProperty =
+ DependencyProperty.Register("ShowCellBorder", typeof(bool), typeof(TreeGrid),
+ new PropertyMetadata(false, new PropertyChangedCallback(TreeGrid.OnShowCellBorderPropertyChanged)));
+
+ private static void OnShowCellBorderPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ if (obj is TreeGrid)
+ {
+ (obj as TreeGrid).OnShowCellBorderValueChanged();
+ }
+ }
+
+ protected void OnShowCellBorderValueChanged()
+ {
+
+ }
+ #endregion
+
+ #region IconStroke DependencyProperty
+ public Brush IconStroke
+ {
+ get { return (Brush)GetValue(IconStrokeProperty); }
+ set { SetValue(IconStrokeProperty, value); }
+ }
+ public static readonly DependencyProperty IconStrokeProperty =
+ DependencyProperty.Register("IconStroke", typeof(Brush), typeof(TreeGrid),
+ new PropertyMetadata(new SolidColorBrush(Colors.LightGray), new PropertyChangedCallback(TreeGrid.OnIconStrokePropertyChanged)));
+
+ private static void OnIconStrokePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ if (obj is TreeGrid)
+ {
+ (obj as TreeGrid).OnIconStrokeValueChanged();
+ }
+ }
+
+ protected void OnIconStrokeValueChanged()
+ {
+
+ }
+ #endregion
+
+ #region CellBorderBrush DependencyProperty
+ public Brush CellBorderBrush
+ {
+ get { return (Brush)GetValue(CellBorderBrushProperty); }
+ set { SetValue(CellBorderBrushProperty, value); }
+ }
+ public static readonly DependencyProperty CellBorderBrushProperty =
+ DependencyProperty.Register("CellBorderBrush", typeof(Brush), typeof(TreeGrid),
+ new PropertyMetadata(new SolidColorBrush(Colors.LightGray), new PropertyChangedCallback(TreeGrid.OnCellBorderBrushPropertyChanged)));
+
+ private static void OnCellBorderBrushPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ if (obj is TreeGrid)
+ {
+ (obj as TreeGrid).OnCellBorderBrushValueChanged();
+ }
+ }
+
+ protected void OnCellBorderBrushValueChanged()
+ {
+
+ }
+ #endregion
+
+ protected override DependencyObject GetContainerForItemOverride()
+ {
+ return new TreeGridItem();
+ }
+
+ protected override bool IsItemItsOwnContainerOverride(object item)
+ {
+ return item is TreeGridItem;
+ }
+
+ protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
+ {
+ base.OnItemsChanged(e);
+ }
+ }
+
+ public class TreeGridItem : TreeViewItem
+ {
+ public event EventHandler IconStateChanged;
+ static TreeGridItem()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeGridItem), new FrameworkPropertyMetadata(typeof(TreeGridItem)));
+ }
+
+ public TreeGridItem()
+ {
+ this.DataContextChanged += TreeGridItem_DataContextChanged;
+ }
+
+ private void TreeGridItem_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
+ {
+ if (e.OldValue != null && e.OldValue is TreeItemData oldTreeData) {
+ oldTreeData.VisibleChange -= DataVisiableChange;
+ }
+ if (DataContext != null && DataContext is TreeItemData treeData)
+ {
+ this.SetBinding(IsExpandedProperty, new Binding("IsExpanded") { Source = treeData, Mode = BindingMode.TwoWay });
+ treeData.VisibleChange += DataVisiableChange;
+ }
+ }
+
+ private void DataVisiableChange(object sender, bool visiable) {
+ var sss = visiable;
+ }
+
+
+ protected override void OnVisualParentChanged(DependencyObject oldParent)
+ {
+ base.OnVisualParentChanged(oldParent);
+ }
+
+ protected override DependencyObject GetContainerForItemOverride()
+ {
+ return new TreeGridItem();
+ }
+
+ protected override bool IsItemItsOwnContainerOverride(object item)
+ {
+ return item is TreeGridItem;
+ }
+ }
+
+ /*
+ * https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/GridViewRowPresenter.cs,ace7d38fc902993d
+ * GridViewRow閲岀殑姣忎釜鍏冪礌锛屽鍔犱簡涓�涓粯璁ょ殑Margin锛岃繖鏍峰湪璁剧疆杈规鐨勬椂鍊欎細姣旇緝楹荤儲锛屽湪杩愯鏃跺幓鎺�
+ */
+ public class TreeGridCell : ContentControl
+ {
+ static TreeGridCell()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeGridCell), new FrameworkPropertyMetadata(typeof(TreeGridCell)));
+ }
+
+ public TreeGridCell()
+ {
+ Loaded += TreeGridCell_Loaded;
+ }
+
+ private void TreeGridCell_Loaded(object sender, RoutedEventArgs e)
+ {
+ Loaded -= TreeGridCell_Loaded;
+ var p = VisualTreeHelper.GetParent(this);
+ if (p != null && p is FrameworkElement f && f.Margin.Left > 0)
+ {
+ f.Margin = new Thickness(0);
+ }
+ }
+ }
+
+ public static class TreeHelper
+ {
+ public static T FindParent<T>(this DependencyObject obj)
+ {
+ var p = VisualTreeHelper.GetParent(obj);
+ if (p == null)
+ {
+ return default(T);
+ }
+ if (p is T tt)
+ {
+ return tt;
+ }
+ return FindParent<T>(p);
+ }
+
+ public static IEnumerable<T> FindChild<T>(this DependencyObject obj) where T : DependencyObject
+ {
+ if (obj == null)
+ {
+ yield break;
+ }
+ for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
+ {
+ DependencyObject child = VisualTreeHelper.GetChild(obj, i);
+ if (child == null)
+ {
+ continue;
+ }
+ if (child is T)
+ {
+ yield return (T)child;
+ }
+ else
+ {
+ foreach (var c in FindChild<T>(child))
+ {
+ yield return c;
+ }
+ }
+ }
+ }
+
+ public static T FindTreeResource<T>(this FrameworkElement obj, string key)
+ {
+ if (obj == null)
+ {
+ return default(T);
+ }
+ var r = obj.TryFindResource(key);
+ if (r == null)
+ {
+ r = Application.Current.TryFindResource(key);
+ }
+ if (r != null && r is T t)
+ {
+ return t;
+ }
+
+ var p = FindParent<FrameworkElement>(obj);
+ if (p != null)
+ {
+ return FindTreeResource<T>(p, key);
+ }
+ return default(T);
+ }
+ }
+
+ public class LevelToMarginConverter : IValueConverter
+ {
+ public object Convert(object o, Type type, object parameter, CultureInfo culture)
+ {
+ return new Thickness((int)o * c_IndentSize, 0, 0, 0);
+ }
+
+ public object ConvertBack(object o, Type type, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+
+ private const double c_IndentSize = 15.0;
+ }
+}
--
Gitblit v1.9.1