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

This commit is contained in:
Sunny 2024-01-20 11:59:18 +08:00
parent 8286051404
commit 326f0fb8f6
2 changed files with 64 additions and 26 deletions

View File

@ -116,11 +116,19 @@ namespace Sunny.UI
/// <summary> /// <summary>
/// 背景色 /// 背景色
/// </summary> /// </summary>
public Color BackColor; public Color BackColor { get; set; }
/// <summary> /// <summary>
/// 前景色 /// 前景色
/// </summary> /// </summary>
public Color ForeColor; public Color ForeColor { get; set; }
public Color HoverColor { get; set; }
public Color SelectedColor { get; set; }
public Color SelectedForeColor { get; set; }
public bool HaveHoveColor { get; set; } = false;
} }
} }

View File

@ -36,6 +36,7 @@
* 2023-07-02: V3.3.9 DrawMode属性OwnerDrawAll * 2023-07-02: V3.3.9 DrawMode属性OwnerDrawAll
* 2023-11-13: V3.5.2 * 2023-11-13: V3.5.2
* 2024-01-01: V3.6.2 * 2024-01-01: V3.6.2
* 2024-01-20: V3.6.3 SetNodePainter
******************************************************************************/ ******************************************************************************/
using System; using System;
@ -265,16 +266,31 @@ namespace Sunny.UI
public void SetNodePainter(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.NotContainsKey(node))
{ {
view.Painter[node].BackColor = backColor; view.Painter.TryAdd(node, new UITreeNodePainter());
view.Painter[node].ForeColor = foreColor;
}
else
{
view.Painter.TryAdd(node, new UITreeNodePainter() { BackColor = backColor, ForeColor = foreColor });
} }
view.Painter[node].BackColor = backColor;
view.Painter[node].ForeColor = foreColor;
view.Painter[node].HaveHoveColor = false;
view.Invalidate();
}
public void SetNodePainter(TreeNode node, Color backColor, Color foreColor, Color hoverColor, Color selectedColor, Color selectedForeColor)
{
if (view.IsNull()) return;
if (view.Painter.NotContainsKey(node))
{
view.Painter.TryAdd(node, new UITreeNodePainter());
}
view.Painter[node].BackColor = backColor;
view.Painter[node].ForeColor = foreColor;
view.Painter[node].HoverColor = hoverColor;
view.Painter[node].SelectedColor = selectedColor;
view.Painter[node].SelectedForeColor = selectedForeColor;
view.Painter[node].HaveHoveColor = true;
view.Invalidate(); view.Invalidate();
} }
@ -1154,30 +1170,44 @@ namespace Sunny.UI
var checkboxColor = ForeColor; var checkboxColor = ForeColor;
if (e.Node != null) if (e.Node != null)
{
if (Painter.ContainsKey(e.Node))
{
e.Graphics.FillRectangle(Painter[e.Node].BackColor, 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, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft);
}
else
{ {
if (e.Node == SelectedNode) if (e.Node == SelectedNode)
{ {
e.Graphics.FillRectangle(SelectedColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); Color sc = SelectedColor;
e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); Color scf = SelectedForeColor;
if (Painter.ContainsKey(e.Node) && Painter[e.Node].HaveHoveColor)
{
sc = Painter[e.Node].SelectedColor;
scf = Painter[e.Node].SelectedForeColor;
}
e.Graphics.FillRectangle(sc, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, scf, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft);
checkboxColor = SelectedForeColor; checkboxColor = SelectedForeColor;
} }
else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) 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))); Color hc = HoverColor;
if (Painter.ContainsKey(e.Node) && Painter[e.Node].HaveHoveColor)
{
hc = Painter[e.Node].HoverColor;
}
e.Graphics.FillRectangle(hc, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft);
} }
else else
{ {
e.Graphics.FillRectangle(FillColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); Color fc = FillColor;
e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); Color fcf = ForeColor;
if (Painter.ContainsKey(e.Node))
{
fc = Painter[e.Node].BackColor;
fcf = Painter[e.Node].ForeColor;
} }
e.Graphics.FillRectangle(fc, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height)));
e.Graphics.DrawString(e.Node.Text, Font, fcf, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft);
} }
if (haveImage) if (haveImage)