我创建了一个继承树视图(CustomTreeview)的类,这将是我在整个问题中都在使用的类。我想要某种方法来阻止CustomTreeview绘画自身和节点,直到所有折叠或展开完成。我将其称为屏幕更新,因为我熟悉VBA。我尝试覆盖OnPaint方法以及OnNodeDraw方法。虽然,node.toggle方法和CollapseAll / ExpandAll方法都不会触发OnPaint / OnNodeDraw方法中的任何一个。下面是我为两种OnPaint / OnNodeDraw方法尝试过的方法(名称和输入显然略有不同,以满足覆盖)。
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
if (!collapsing && !expanding)
{
base.OnDrawNode(e);
NotifyNodeDrawn(this, e);
}
}
[NotifyNodeDrawn触发了一个我在不同类中订阅的事件处理程序,以检查一些逻辑以确定它是否处于扩展或折叠模式(我通过重写CollapseAll / ExpandAll方法设置的布尔值)。
public new void CollapseAll()
{
collapsing = true;
base.CollapseAll();
collapsing = false;
this.Invalidate();
}
public new void ExpandAll()
{
expanding = true;
base.ExpandAll();
expanding = false;
this.Invalidate();
}
如果这可以按照我想要的方式工作,那么例如当我调用ExpandAll()时,在调用CustomTreeview.Invalidate()之前,节点不会重绘。但是,正如我在调用ExpandAll / CollapseAll之前所说的那样,根本不输入OnDrawNode / OnPaint方法。
谢谢您的帮助!
[好,我已经尝试了好几天了,在发布问题之后,我终于找到了解决方法。在调用EndUpdate()之前,BeginUpdate()阻止控件重绘。简单有效的解决方案!我将把它留在这里,希望对其他人有所帮助!如果有人对此谜题有任何解决方案,则它仍不会输入OnDrawNode / OnPaint替代。
public new void ExpandAll()
{
BeginUpdate();
expanding = true;
base.ExpandAll();
expanding = false;
EndUpdate();
}