Пользовательский WPF Treeview - PullRequest
3 голосов
/ 29 декабря 2010

Я пытаюсь написать собственный вид дерева в WPF, где дочерние элементы связаны с их родителями линиями.

Сложно объяснить, но я в основном пытаюсь создать собственную версию ниже.древовидная структура, чтобы наш дизайнер мог настроить его так, как требуется:

требование

Есть ли простой способ сделать это?До сих пор я хакнул на это и не очень далеко.

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Это интересная проблема.Я думаю, что, вероятно, вам нужно создать пользовательский элемент управления, который подклассов TreeViewItem, и добавить пару свойств зависимостей, которые родительский класс не предоставляет.

, поскольку TreeViewItem наследуется от ItemsControl, а не Selector, у него нет свойств SelectedItem или SelectedIndex.Ваш пользовательский элемент управления должен реализовать эти свойства.Хитрость в этом заключается в установке SelectedItem: это может быть элемент, для которого IsSelected имеет значение true, или это может быть элемент, свойство которого Items содержит элемент, для которого SelectedItem не равно нулю.Свойство SelectedIndex должно работать точно так же.

Еще одно свойство, которое вам понадобится - и я не уверен, как вы его вычислите - это высота линии, которая будет идтив строку 1, столбец 0 сетки в шаблоне TreeViewItem.Может быть возможно рассчитать это как функцию от SelectedIndex и строки ActualHeight, что было бы неплохо, потому что тогда вам не нужно вмешиваться ни в одну из деталей того, как отображается элемент управления.

В любом случае, если у вас есть эти свойства, редактирование шаблона управления для их использования должно быть простым.У вас есть круг вокруг треугольника расширителя, который виден, только если SelectedItem не равно нулю.(На самом деле это круг с линией, спускающейся к нижней части ячейки сетки.) У вас есть линия, продолжающаяся от круга к левому краю ячейки сетки, которая видна, если SelectedItem не равно нулю и Parentненулевой.У вас есть вертикальная линия в строке 1, столбце 0 сетки, которая снова видна, только если SelectedItem не равно нулю.

Тогда у вас есть элементы, которые отображаются, если IsSelected истинно: горизонтальная линия в ячейке расширителя и фон черной стрелки.

На самом деле это не сумасшедший объем работы, чтобы получитьтакой крутой эффект, я думаю.

0 голосов
/ 29 декабря 2010

Для настройки WPF TreeView важна пара вещей:

  1. Использование привязки данных для привязки узлов TreeView к объектам ViewModel для узлов
  2. Создание шаблонов данных, соответствующих типу узлов ViewModel

У Джоша Смита есть хорошая статья о Code Project , которая объясняет все это и многое другое.

Edit:

Вы можете поместить полный UserControl в узел, который делает все, что может UserControl.

Редактировать 2:

Из обновленной иллюстрации я бы предложил создать стиль для TreeView. Шаблоны данных применяются только к отдельным узлам элементов в дереве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...