树形闪烁?(Treeview flickering?)

2019-06-24 00:50发布

我才知道,通过增加TreeView.BeginUpdate将防止树视图的闪烁,但是当我在我的项目增加它在我的TreeView的所有节点消失,任何机构可以告诉我为什么会发生,这里是我使用TreeView控件的代码片段.BeginUpdate和TreeView.EndUpdate

  TreeNode treeNode = new TreeNode("Windows");
        treeView1.Nodes.Add(treeNode);
        //
        // Another node following the first node.
        //
        treeNode = new TreeNode("Linux");
        treeView1.Nodes.Add(treeNode);
        //
        // Create two child nodes and put them in an array.
        // ... Add the third node, and specify these as its children.
        //
        TreeNode node2 = new TreeNode("C#");
        TreeNode node3 = new TreeNode("VB.NET");
        TreeNode[] array = new TreeNode[] { node2, node3 };
        //
        // Final node.
        //
        treeNode = new TreeNode("Dot Net Perls", array);
        treeView1.Nodes.Add(treeNode);

Answer 1:

开始/ 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);
}


文章来源: Treeview flickering?