Ладно ... это как бы два участника здесь. (В некотором роде. Может быть, на самом деле просто один. Это то, на что я надеюсь в любом случае.)
Во-первых, можно ли нацелить, только через XAML, на именованный элемент в шаблоне элемента управления ? Например, если шаблон элемента управления имеет ContentPresenter с именем «PART_Foo», и мы хотим специально установить для HorizontalAlignment этого конкретного элемента значение «Растянуть» с помощью чистого стиля, можно ли это сделать? Я знаю, что мы можем сделать это в переопределении OnApplyTemplate подкласса, где мы явно ищем элемент управления по имени, затем устанавливаем свойство в коде, но, опять же, мы надеемся на решение только для XAML, поэтому мы можем сделать это строго с помощью стилей а не подклассы, которые в большинстве случаев не поощряются, за исключением конкретных сценариев использования.
Кроме того, мы не хотим вручную указать шаблон для элемента управления, поскольку мы хотим, чтобы текущая тема определяла, что это за шаблон и, следовательно, как выглядит элемент управления. Мы просто хотим сказать: «В любом шаблоне, который выбрала тема, если есть деталь с именем« foo », установите это свойство в чистом стиле. Если деталь с таким именем не найдена, ничего не делать!
Стремление к подходу, основанному только на XAML, больше связано со второй частью, которая заключается в том, что мы нацелены на сгенерированный контейнерный объект, а не на сам элемент управления, что означает, что он в любом случае не будет прямым подклассом, как у нас было бы возиться с ItemcontainerGenerators и тому подобным, что является настоящей болью в $$, особенно когда ItemsControl виртуализирован.
В частности, наша конечная цель - выделить границу с именем «Bd» в шаблоне TreeViewItem TreeView и установить для присоединенного свойства «Grid.ColumnSpan» значение «2» вместо значения по умолчанию «1». Это оно! Меня поражает, как что-то настолько простое кажется чертовски невозможным без ручной замены всего шаблона TreeViewItem или использования решения на основе кода.