更改TreeNode.BackColor会导致完整的TreeView重绘

时间:2010-07-22 05:04:56

标签: winforms treeview treenode redraw backcolor

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

知道为什么会发生这种情况以及是否可以轻易停止?

1 个答案:

答案 0 :(得分:1)

看起来你不能阻止这种情况发生。我看了一下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();
            }
        }
    }
}

每当BackColor发生更改时,都会在包含该节点的树上强制使用invalidate。再次,查看InvalidateHostTree函数,没有可以设置的标志来阻止刷新发生。