* UITreeView: 自定义行颜色,可通过代码给颜色值,SetNodePainter

This commit is contained in:
Sunny 2022-04-01 16:36:52 +08:00
parent 3b65cf824d
commit 3492d94dc4
3 changed files with 36 additions and 21 deletions

Binary file not shown.

View File

@ -74,6 +74,7 @@ namespace Sunny.UI
ControlStyles.OptimizedDoubleBuffer, true); ControlStyles.OptimizedDoubleBuffer, true);
_lastDistance = SplitterDistance; _lastDistance = SplitterDistance;
SplitterWidth = 10; SplitterWidth = 10;
MinimumSize = new Size(20, 20);
} }
private Color barColor = Color.FromArgb(56, 56, 56); private Color barColor = Color.FromArgb(56, 56, 56);

View File

@ -24,6 +24,7 @@
* 2022-01-05: V3.0.9 TreeNodeStateSync: * 2022-01-05: V3.0.9 TreeNodeStateSync:
* 2022-03-19: V3.1.1 * 2022-03-19: V3.1.1
* 2022-04-01: V3.1.2 * 2022-04-01: V3.1.2
* 2022-04-01: V3.1.2 SetNodePainter
******************************************************************************/ ******************************************************************************/
using System; using System;
@ -84,7 +85,7 @@ namespace Sunny.UI
view.AfterLabelEdit += View_AfterLabelEdit; view.AfterLabelEdit += View_AfterLabelEdit;
} }
public void AddNodePainter(TreeNode node, Color backColor, Color foreColor) public void SetNodePainter(TreeNode node, Color backColor, Color foreColor)
{ {
if (view.IsNull()) return; if (view.IsNull()) return;
if (view.Painter.ContainsKey(node)) if (view.Painter.ContainsKey(node))
@ -96,6 +97,8 @@ namespace Sunny.UI
{ {
view.Painter.TryAdd(node, new UITreeNodePainter() { BackColor = backColor, ForeColor = foreColor }); view.Painter.TryAdd(node, new UITreeNodePainter() { BackColor = backColor, ForeColor = foreColor });
} }
view.Invalidate();
} }
public void ClearNodePainter(TreeNode node) public void ClearNodePainter(TreeNode node)
@ -104,6 +107,7 @@ namespace Sunny.UI
if (view.Painter.ContainsKey(node)) if (view.Painter.ContainsKey(node))
{ {
view.Painter.TryRemove(node, out _); view.Painter.TryRemove(node, out _);
view.Invalidate();
} }
} }
@ -111,6 +115,7 @@ namespace Sunny.UI
{ {
if (view.IsNull()) return; if (view.IsNull()) return;
view.Painter.Clear(); view.Painter.Clear();
view.Invalidate();
} }
[Description("节点点击时同步父节点和子节点的状态"), Category("SunnyUI")] [Description("节点点击时同步父节点和子节点的状态"), Category("SunnyUI")]
@ -899,30 +904,39 @@ namespace Sunny.UI
var checkboxColor = ForeColor; var checkboxColor = ForeColor;
if (e.Node != null) if (e.Node != null)
{ {
if (Painter.ContainsKey(e.Node))
if (e.Node == SelectedNode)
{ {
e.Graphics.FillRectangle(SelectedColor, e.Graphics.FillRectangle(Painter[e.Node].BackColor,
new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, Painter[e.Node].ForeColor, drawLeft,
e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, drawLeft, e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f);
e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f);
checkboxColor = SelectedForeColor;
}
else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0)
{
e.Graphics.FillRectangle(HoverColor,
new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft,
e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f);
} }
else else
{ {
e.Graphics.FillRectangle(FillColor, if (e.Node == SelectedNode)
new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); {
e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft, e.Graphics.FillRectangle(SelectedColor,
e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f); new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, drawLeft,
e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f);
checkboxColor = SelectedForeColor;
}
else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0)
{
e.Graphics.FillRectangle(HoverColor,
new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft,
e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f);
}
else
{
e.Graphics.FillRectangle(FillColor,
new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, ForeColor, drawLeft,
e.Bounds.Y + (ItemHeight - sf.Height) / 2.0f);
}
} }
if (haveImage) if (haveImage)