Winforms 更改TreeNode.BackColor会导致完全重新绘制TreeView

Winforms 更改TreeNode.BackColor会导致完全重新绘制TreeView,winforms,treeview,treenode,redraw,backcolor,Winforms,Treeview,Treenode,Redraw,Backcolor,我在TreeView中设置特定TreeNode的背景色,以提示用户在使用应用程序时节点发生了有趣的事情。但是,当我设置BackColor时,它会导致整个父TreeView控件重新绘制,而不仅仅是已更改的特定TreeNode的标签区域。我在任何时候都不会调用刷新或更新——只是在TreeNode上设置BackColor。看起来,TreeView并不仅仅是使已更改的TreeNode的边界无效,而是在刷新其整个区域。这会导致恼人的控件快速闪烁 你知道为什么会发生这种情况,以及它是否可以很容易地被阻止吗?

我在TreeView中设置特定TreeNode的背景色,以提示用户在使用应用程序时节点发生了有趣的事情。但是,当我设置BackColor时,它会导致整个父TreeView控件重新绘制,而不仅仅是已更改的特定TreeNode的标签区域。我在任何时候都不会调用刷新或更新——只是在TreeNode上设置BackColor。看起来,TreeView并不仅仅是使已更改的TreeNode的边界无效,而是在刷新其整个区域。这会导致恼人的控件快速闪烁


你知道为什么会发生这种情况,以及它是否可以很容易地被阻止吗?

看起来你无法阻止这种情况的发生。我查看了TreeNode.BackColor setter的代码:

[SRDescription("TreeNodeBackColorDescr"), SRCategory("CatAppearance")]
public Color BackColor
{
    get
    {
        if (this.propBag == null)
        {
            return Color.Empty;
        }
        return this.propBag.BackColor;
    }
    set
    {
        Color backColor = this.BackColor;
        if (value.IsEmpty)
        {
            if (this.propBag != null)
            {
                this.propBag.BackColor = Color.Empty;
                this.RemovePropBagIfEmpty();
            }
            if (!backColor.IsEmpty)
            {
                this.InvalidateHostTree();
            }
        }
        else
        {
            if (this.propBag == null)
            {
                this.propBag = new OwnerDrawPropertyBag();
            }
            this.propBag.BackColor = value;
            if (!value.Equals(backColor))
            {
                this.InvalidateHostTree();
            }
        }
    }
}

每当背景色更改时,将在包含节点的树上强制执行无效。同样,看看InvalidateHostTree函数,没有可以设置的标志来阻止刷新发生。

谢谢。这就是我害怕的。我想一个可行的解决方案可能是OwnerDraw和我自己的CustomBackColor属性。