Подтвердить что ты не робот

Древовидное мерцание?

Я узнал, что добавив 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);
4b9b3361

Ответ 1

Методы 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);
}