Я не могу изменить node.backcolor на узлах деревьев с TreeViewDrawMode.OwnerDrawText C#C#

Место общения программистов C#
Ответить
Anonymous
 Я не могу изменить node.backcolor на узлах деревьев с TreeViewDrawMode.OwnerDrawText C#

Сообщение Anonymous »

У моей формы есть элемент управления Treeview с именем TV1 , который использует treeviewdrawmode.ownerdrawtext и реализует пользовательский обработчик. Он работает так же, как и ожидалось, за исключением того, что узлы, которые передаются в систему с помощью e.drawdefault = true , позволяют мне изменить форум узела, но не узел Backcolor. Если я отключу обработчик, изменяя смод на норму, то бэкколор узлов изменится, как и ожидалось. Пример кода: < /p>

Код: Выделить всё

using System.Drawing;

namespace TreeViewEx
{
public partial class Form1 : Form
{

private bool DoColor = false;
private List ColoredNodes = new();
private Color myColor = SystemColors.HighlightText;
private Color myBackColor = Color.Black;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// tv is the TreeView control on Form1
tv.HideSelection = false;
tv.DrawMode = TreeViewDrawMode.OwnerDrawText;
tv.DrawNode += tv_DrawNode!;
}

private static Color GetContrastColor(Color color)
{
return (color.R * 0.299M) + (color.G * 0.587M) + (color.B * 0.114M) > 149 ?
SystemColors.WindowText :
SystemColors.Window;
}

private void ColorAncestors()
{
foreach (var anode in ColoredNodes)
{
anode.ForeColor = SystemColors.WindowText;
anode.BackColor = SystemColors.Window;
}
ColoredNodes.Clear();
if (!DoColor) { return; }
var node = tv.SelectedNode;
while (node.Parent != null)
{
node = node.Parent;
node.ForeColor = myColor;
node.BackColor = myBackColor;
ColoredNodes.Add(node);
}
}

private void tv_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (e.Node == null) return;

var selected = (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected;
var unfocused = !e.Node.TreeView.Focused;

if (selected && unfocused)
{
using var font = e.Node.NodeFont ?? e.Node.TreeView.Font;
e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
TextRenderer.DrawText(e.Graphics, e.Node.Text, font, e.Bounds,
SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding);
}
else
{
e.DrawDefault = true;
}
}

// cbOwnerDraw is a checkbox on Form1
private void cbOwnerDraw_CheckedChanged(object sender, EventArgs e)
{
tv.DrawMode = cbOwnerDraw.Checked ?
TreeViewDrawMode.OwnerDrawText : TreeViewDrawMode.Normal;
}
}
}
< /code>
Я все искал для любого объяснения для этого, но я прихожу пустым. Мое ожидание состоит в том, что любые узлы, которые явно не нарисованы в обработчике событий (передачи в систему через e.drawdefault = true 
), будут нарисованы с любыми атрибутами, которые я им присвоил. То, что происходит, это то, что Backcolor никогда не меняется. Я ожидаю, что есть простой ответ, но я в тупике.

Подробнее здесь: https://stackoverflow.com/questions/794 ... -ownerdraw
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»