Wpf, створення вузлів treeview

Елементи управління TreeView часто застосовуються для розміщення великих обсягів даних. Пояснюється це тим, що TreeView володіє згортання-розгортається структурою. Навіть в разі прокрутки TreeView користувачем від верху до низу, видимої не обов'язково буде вся доступна в ньому інформація. Інформація, яка не є видимою, може взагалі пропускатися в елементі управління TreeView, скорочуючи накладні витрати (і час, необхідний для його заповнення). Навіть ще краще те, що при відкритті елемента TreeViewItem ініціюється подія Expanded. а при закритті - подія Collapsed. Цей момент дуже зручно використовувати для додавання відсутніх вузлів або видалення тих, що вже більше не потрібні. Такий підхід називається оперативним (just-in-time) створенням вузлів.

Хоча елемент управління TreeView і можна заповнити структурою каталогів жорсткого диска, цей процес є гнітюче повільним. Набагато краще, коли спочатку відображається частково згорнуте уявлення, і користувачеві пропонується самостійно добиратися до конкретних каталогів. При розгортанні кожного вузла в дерево додаються відповідні підкаталоги, і протікає цей процес практично миттєво:

Wpf, створення вузлів treeview

У застосуванні елемента управління TreeView з можливістю оперативного створення вузлів для відображення папок на жорсткому диску немає нічого нового. Перший крок полягає в додаванні в TreeView списку дисків при першому завантаженні вікна. Спочатку вузол для кожного диска представляється в згорнутому вигляді. Буква диска відображається в заголовку, а об'єкт DriveInfo зберігається у властивості TreeViewItem.Tag для спрощення пошуку вкладених каталогів в подальшому без відтворення цього об'єкта. (Це збільшує накладні витрати додатки, пов'язані з пам'яттю, але при цьому скорочує кількість перевірок безпеки доступу до файлів. Загальний ефект є незначним, але зате трохи покращує продуктивність і спрощує код.) Нижче наведено код, в якому TreeView заповнюється списком дисків за допомогою класу System.IO.DriveInfo:

Даний код додає під вузлом кожного диска покажчик місця заповнення (рядок із зірочкою). Цей покажчик не відображається, оскільки вузол спочатку знаходиться в згорнутому стані. При розгортанні вузла цей покажчик можна видалити і додати на його місці список підкаталогів.

Для реалізації оперативного створення вузлів необхідно обробляти подія TreeViewItem.Expanded. Оскільки ця подія підтримує бульбашкової поширення, обробник подій можна приєднувати прямо до елементу TreeView, щоб він обробляв подія Expanded будь-якого знаходиться всередині нього елемента TreeViewItem:

В даний час наведений код здійснює оновлення при кожному розгортанні елемента. При бажанні можна зробити так, щоб оновлення виконувалося тільки при першому розгортанні елемента і виявленні покажчика місця заповнення. Це скоротить обсяг роботи, який має запускає вашу програму, але при цьому також збільшить ймовірність відображення застарілої інформації.

В якості альтернативи можна зробити так, щоб оновлення виконувалося при кожному виборі елемента, за рахунок обробки події ViewItem.Selected, або застосувати компонент начебто System.IO.FileSystemWatcher для очікування повідомлень від операційної системи при додаванні, видаленні чи перейменування папки. Компонент FileSystemWatcher є єдиним способом гарантувати, що оновлення дерева каталогів буде здійснюватися відразу ж при появі зміни, але загрожує найбільшими накладними витратами.

Комбінуючи з TreeView потужні можливості шаблонів елементів управління. можна домогтися багато чого. Наприклад, можна створювати елементи управління, радикально відрізняються як за зовнішнім виглядом, так і по поведінці, просто замінюючи шаблони для елементів управління TreeView і TreeViewItem.

Схожі статті