From 7ec8b634e0517da189c6e1d822890aa5de245255 Mon Sep 17 00:00:00 2001 From: chenliang624 Date: Fri, 24 Sep 2021 14:43:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93Node=E8=B5=8B=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=80=BC=E6=97=B6=EF=BC=8C=E7=BB=99=E6=8E=A7=E4=BB=B6=E7=BB=98?= =?UTF-8?q?=E5=88=B6=E4=B8=89=E7=A7=8D=E7=8A=B6=E6=80=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SunnyUI/Controls/UITreeView.cs | 54 ++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/SunnyUI/Controls/UITreeView.cs b/SunnyUI/Controls/UITreeView.cs index 1e110beb..1bc6c538 100644 --- a/SunnyUI/Controls/UITreeView.cs +++ b/SunnyUI/Controls/UITreeView.cs @@ -712,6 +712,7 @@ namespace Sunny.UI g.Dispose(); } + protected override void OnDrawNode(DrawTreeNodeEventArgs e) { base.OnDrawNode(e); @@ -720,6 +721,17 @@ namespace Sunny.UI try { + if (!DicNodeStatus.ContainsKey(e.Node.GetHashCode())) + { + DicNodeStatus.Add(e.Node.GetHashCode(), false); + } + if (CheckBoxes) + { + if (e.Node.Parent != null && DicNodeStatus.ContainsKey(e.Node.Parent.GetHashCode()) && !DicNodeStatus[e.Node.Parent.GetHashCode()]) + { + SetParentNodeCheckedState(e.Node); + } + } if (BorderStyle == BorderStyle.Fixed3D) BorderStyle = BorderStyle.FixedSingle; if (e.Node == null || e.Node.Bounds.Width <= 0 && e.Node.Bounds.Height <= 0 && e.Node.Bounds.X <= 0 && e.Node.Bounds.Y <= 0) @@ -728,6 +740,7 @@ namespace Sunny.UI } else { + var drawLeft = (e.Node.Level + 1) * Indent + 3; var checkBoxLeft = (e.Node.Level + 1) * Indent + 1; var imageLeft = drawLeft; @@ -750,6 +763,7 @@ namespace Sunny.UI var checkboxColor = ForeColor; if (e.Node != null) { + if (e.Node == SelectedNode) { e.Graphics.FillRectangle((e.State & TreeNodeStates.Hot) != 0 ? HoverColor : SelectedColor, @@ -788,6 +802,8 @@ namespace Sunny.UI if (CheckBoxes) { + + if (!e.Node.Checked) { e.Graphics.DrawRectangle(checkboxColor, @@ -811,11 +827,6 @@ namespace Sunny.UI } } - if (!DicNodeStatus.ContainsKey(e.Node.GetHashCode())) - { - DicNodeStatus.Add(e.Node.GetHashCode(), false); - } - if (DicNodeStatus[e.Node.GetHashCode()]) { //var location = e.Node.Bounds.Location; @@ -930,17 +941,18 @@ namespace Sunny.UI DicNodeStatus[e.Node.GetHashCode()] = false; SetChildNodeCheckedState(e.Node, e.Node.Checked); - if (e.Node.Parent != null) - { - SetParentNodeCheckedState(e.Node); - } + + SetParentNodeCheckedState(e.Node, true); } } - private void SetParentNodeCheckedState(TreeNode currNode) + private void SetParentNodeCheckedState(TreeNode currNode, bool ByMouse = false) { + + if (currNode.Parent == null) + return; TreeNode parentNode = currNode.Parent; //获得当前节点的父节点 var count = parentNode.Nodes.Cast().Where(n => n.Checked).ToList().Count; @@ -958,17 +970,19 @@ namespace Sunny.UI DicNodeStatus[parentNode.GetHashCode()] = false; } - - var g = CreateGraphics(); - OnDrawNode(new DrawTreeNodeEventArgs(g, parentNode, - new Rectangle(0, parentNode.Bounds.Y, Width, parentNode.Bounds.Height), TreeNodeStates.Hot)); - g.Dispose(); - - - if (parentNode.Parent != null) //如果父节点之上还有父节点 + if (ByMouse) { - SetParentNodeCheckedState(parentNode); //递归调用 + var g = CreateGraphics(); + OnDrawNode(new DrawTreeNodeEventArgs(g, parentNode, + new Rectangle(0, parentNode.Bounds.Y, Width, parentNode.Bounds.Height), TreeNodeStates.Hot)); + g.Dispose(); + + if (parentNode.Parent != null) //如果父节点之上还有父节点 + { + SetParentNodeCheckedState(parentNode, ByMouse); //递归调用 + } } + } @@ -986,6 +1000,8 @@ namespace Sunny.UI } } } + + } } } \ No newline at end of file