Winforms 更改TreeNode.BackColor会导致完全重新绘制TreeView
我在TreeView中设置特定TreeNode的背景色,以提示用户在使用应用程序时节点发生了有趣的事情。但是,当我设置BackColor时,它会导致整个父TreeView控件重新绘制,而不仅仅是已更改的特定TreeNode的标签区域。我在任何时候都不会调用刷新或更新——只是在TreeNode上设置BackColor。看起来,TreeView并不仅仅是使已更改的TreeNode的边界无效,而是在刷新其整个区域。这会导致恼人的控件快速闪烁Winforms 更改TreeNode.BackColor会导致完全重新绘制TreeView,winforms,treeview,treenode,redraw,backcolor,Winforms,Treeview,Treenode,Redraw,Backcolor,我在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属性。