Begin/EndUpdate() 方法不是旨在消除闪烁。 EndUpdate() 的闪烁是不可避免的,它会重新绘制控件。它们旨在加速添加大量节点,默认情况下这会很慢,因为每个项目都会导致重绘。您将它们放在 for 循环中,将它们移到外部以立即改进,从而使情况变得更糟。

这可能足以解决您的问题。但是你可以做得更好,抑制闪烁需要双缓冲。 .NET TreeView 类重写 DoubleBuffered 属性并将其隐藏。这是一个历史事故,Windows 原生控件只支持Windows XP 及更高版本的双缓冲。 .NET曾经支持Windows 2000和Windows 98。

现在这已经不完全相关了。您可以通过从 TreeView 派生您自己的类来放回它。向您的项目添加一个新类并粘贴如下所示的代码。编译。将工具箱顶部的新控件放到窗体上,替换现有的 TreeView。效果非常明显,尤其是在滚动时。

using System;

using System.Windows.Forms;

using System.Runtime.InteropServices;

class BufferedTreeView : TreeView {

protected override void OnHandleCreated(EventArgs e) {

SendMessage(this.Handle, TVM_SETEXTENDEDSTYLE, (IntPtr)TVS_EX_DOUBLEBUFFER, (IntPtr)TVS_EX_DOUBLEBUFFER);

base.OnHandleCreated(e);

}

// Pinvoke:

private const int TVM_SETEXTENDEDSTYLE = 0x1100 + 44;

private const int TVM_GETEXTENDEDSTYLE = 0x1100 + 45;

private const int TVS_EX_DOUBLEBUFFER = 0x0004;

[DllImport("user32.dll")]

private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

}