Это интересная проблема.Я думаю, что, вероятно, вам нужно создать пользовательский элемент управления, который подклассов TreeViewItem
, и добавить пару свойств зависимостей, которые родительский класс не предоставляет.
, поскольку TreeViewItem
наследуется от ItemsControl
, а не Selector
, у него нет свойств SelectedItem
или SelectedIndex
.Ваш пользовательский элемент управления должен реализовать эти свойства.Хитрость в этом заключается в установке SelectedItem
: это может быть элемент, для которого IsSelected
имеет значение true, или это может быть элемент, свойство которого Items
содержит элемент, для которого SelectedItem
не равно нулю.Свойство SelectedIndex
должно работать точно так же.
Еще одно свойство, которое вам понадобится - и я не уверен, как вы его вычислите - это высота линии, которая будет идтив строку 1, столбец 0 сетки в шаблоне TreeViewItem
.Может быть возможно рассчитать это как функцию от SelectedIndex
и строки ActualHeight
, что было бы неплохо, потому что тогда вам не нужно вмешиваться ни в одну из деталей того, как отображается элемент управления.
В любом случае, если у вас есть эти свойства, редактирование шаблона управления для их использования должно быть простым.У вас есть круг вокруг треугольника расширителя, который виден, только если SelectedItem
не равно нулю.(На самом деле это круг с линией, спускающейся к нижней части ячейки сетки.) У вас есть линия, продолжающаяся от круга к левому краю ячейки сетки, которая видна, если SelectedItem
не равно нулю и Parent
ненулевой.У вас есть вертикальная линия в строке 1, столбце 0 сетки, которая снова видна, только если SelectedItem
не равно нулю.
Тогда у вас есть элементы, которые отображаются, если IsSelected
истинно: горизонтальная линия в ячейке расширителя и фон черной стрелки.
На самом деле это не сумасшедший объем работы, чтобы получитьтакой крутой эффект, я думаю.