Изменить или настроить существующий шаблон элемента управления TreeViewItem? - PullRequest
0 голосов
/ 30 сентября 2010

Ладно ... это как бы два участника здесь. (В некотором роде. Может быть, на самом деле просто один. Это то, на что я надеюсь в любом случае.)

Во-первых, можно ли нацелить, только через XAML, на именованный элемент в шаблоне элемента управления ? Например, если шаблон элемента управления имеет ContentPresenter с именем «PART_Foo», и мы хотим специально установить для HorizontalAlignment этого конкретного элемента значение «Растянуть» с помощью чистого стиля, можно ли это сделать? Я знаю, что мы можем сделать это в переопределении OnApplyTemplate подкласса, где мы явно ищем элемент управления по имени, затем устанавливаем свойство в коде, но, опять же, мы надеемся на решение только для XAML, поэтому мы можем сделать это строго с помощью стилей а не подклассы, которые в большинстве случаев не поощряются, за исключением конкретных сценариев использования.

Кроме того, мы не хотим вручную указать шаблон для элемента управления, поскольку мы хотим, чтобы текущая тема определяла, что это за шаблон и, следовательно, как выглядит элемент управления. Мы просто хотим сказать: «В любом шаблоне, который выбрала тема, если есть деталь с именем« foo », установите это свойство в чистом стиле. Если деталь с таким именем не найдена, ничего не делать!

Стремление к подходу, основанному только на XAML, больше связано со второй частью, которая заключается в том, что мы нацелены на сгенерированный контейнерный объект, а не на сам элемент управления, что означает, что он в любом случае не будет прямым подклассом, как у нас было бы возиться с ItemcontainerGenerators и тому подобным, что является настоящей болью в $$, особенно когда ItemsControl виртуализирован.

В частности, наша конечная цель - выделить границу с именем «Bd» в шаблоне TreeViewItem TreeView и установить для присоединенного свойства «Grid.ColumnSpan» значение «2» вместо значения по умолчанию «1». Это оно! Меня поражает, как что-то настолько простое кажется чертовски невозможным без ручной замены всего шаблона TreeViewItem или использования решения на основе кода.

1 Ответ

0 голосов
/ 30 сентября 2010

Нет, это невозможно только при использовании XAML.Вам, по крайней мере, нужно написать для этого прикрепленное свойство (которое затем можно использовать в XAML).И это будет работать, только если у вас нет элементов управления, создаваемых на лету во время выполнения, как это происходит в виртуализированных списках.Это будет выглядеть примерно так: c:TemplateHelper.ReplaceStretchForTemplateItemName="PART_Foo".В измененном обработчике вы должны пройти по визуальному поддереву этого элемента управления, используя VisualTreeHelper , и найти это имя и применить любое, что вам захочется.быть плохой практикой.Весьма вероятно, что в будущем будет тема, которая не будет иметь Part_Foo, или что Part_Foo будет чем-то совершенно другим, чем вы ожидали.Темы и, следовательно, ControlTemplates могут быть изменены.Новые темы будут появляться (и автоматически применяться к вашему приложению), когда Microsoft обновляет свои операционные системы, и если вы поддерживаете пользовательские темы, дизайнеры могут предложить другую тему.

Можно утверждать, что это недостатокControlTemplates и в какой-то степени это так.Но затем снова попробуйте настроить элементы управления в формах Windows (или любой другой структуре пользовательского интерфейса на этой планете) ... Просто, когда вы привыкаете к огромной гибкости WPF, труднее принять ограничения, которые в данном случае являются разработанными.

...