Вопрос по c#, treeview – Treeview мерцает?

19

Я узнал, что добавление TreeView.BeginUpdate предотвратит мерцание древовидной структуры, но когда я добавил его в свой проект, все узлы моего древовидной структуры исчезнут .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);
Добавьте / назначьте корневой узел, с которым вы работаете, только после построения дерева. IIRC это намного быстрее. leppie
@ Джереми Томпсон, ты имеешь в виду, что первое место вообще не требуется, содержит меньше узлов? vettori
несмотря на сомнительный код, кажется, вы пытаетесь устранить симптом проблемы. Это реальный вопрос, почему вы начали мерцать? или не было мерцания? Jeremy Thompson
Если я использовал чуть выше, добавление узлов, я имею в виду (.Nodes.Add) будет достаточно? vettori
Этот первый не выглядит правильным - вы делаетеBeginUpdate/EndUpdate в петле - и что еще хуже,EndUpdate вложен в некоторый условный код - обычно я ожидаю увидеть что-то, подавляющее визуальные обновления, которые будут обернуты вокруг всего набора обновлений (согласно вашему второму примеру) Damien_The_Unbeliever

Ваш Ответ

1   ответ
65

not Предназначен для устранения мерцания. Получение мерцания в EndUpdate () неизбежно, оно перерисовывает элемент управления. Они были разработаны для ускорения добавления большого количества узлов, что по умолчанию будет медленным, поскольку каждый элемент вызывает перерисовку. Вы сделали это намного хуже, поместив их в цикл for, переместив их наружу для немедленного улучшения.

Этого, вероятно, будет достаточно, чтобы решить вашу проблему. Но вы можете сделать это лучше, подавление мерцания требует двойной буферизации. Класс .NET TreeView переопределяет свойство DoubleBuffered иhides Это. Что является исторической случайностью, собственный элемент управления 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);
}
Спасибо за это решение. Это все еще необходимо в 2018 году ...
MSDN предполагает, что ваше использование TVM_SETEXTENDEDSTYLE не совсем правильно; вmsdn.microsoft.com/en-us/library/windows/desktop/… WPARAM - это маска, а LPARAM - это флаг. Так что пропустите получение старого стиля и просто выполните SendMessage (this.Handle, TVM_SETEXTENDEDSTYLE, (IntPtr) TVS_EX_DOUBLEBUFFER, (IntPtr) TVS_EX_DOUBLEBUFFER);
Тьфу, действительно. Я использую старую копию библиотеки MSDN, которая документирует это неправильно. Спасибо за правильное!

Похожие вопросы