我在TreeView中设置特定TreeNode的BackColor,作为用户提示节点在使用应用程序时发生了一些有趣的事情。但是,当我设置BackColor时,它会导致整个父TreeView控件重绘,而不仅仅是已更改的特定TreeNode的标签区域。我不是在任何时候调用Refresh或Update - 只是在TreeNode上设置BackColor。看起来,TreeView正在刷新其整个区域,而不仅仅是使已经更改的TreeNode的边界无效。这导致控制的烦人快速闪烁。
知道为什么会发生这种情况以及是否可以轻易停止?
答案 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函数,没有可以设置的标志来阻止刷新发生。