C#在折叠或展开树视图中的所有树节点时禁用屏幕更新

问题描述 投票:0回答:1

我创建了一个继承树视图(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方法。

谢谢您的帮助!

c# treeview
1个回答
0
投票

[好,我已经尝试了好几天了,在发布问题之后,我终于找到了解决方法。在调用EndUpdate()之前,BeginUpdate()阻止控件重绘。简单有效的解决方案!我将把它留在这里,希望对其他人有所帮助!如果有人对此谜题有任何解决方案,则它仍不会输入OnDrawNode / OnPaint替代。

public new void ExpandAll()
{
    BeginUpdate();
    expanding = true;
    base.ExpandAll();
    expanding = false;
    EndUpdate();
}
© www.soinside.com 2019 - 2024. All rights reserved.