Расширение подэлемента в ControlTemplate - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь расширить заголовок Expander (часть ToggleButton ), чтобы учесть некоторые дополнительные функции.Будучи довольно новым для расширения элементов управления WPF с помощью ControlTemplates, я уже согласился с тем, что мне придется полностью заменить шаблон Expander своим собственным (без возможности повторного использования первоначально определенных компонентов или даже стилей, что делает это совсем немногораздражает, на мой взгляд - но вопрос не в этом).

Однако я хотел представить некоторые свойства, которые изменяют внешний вид и работу компонента.Поэтому я создал новый подтип Expander, который просто определяет новые свойства зависимостей, которые я хочу использовать.Но я заметил, что, учитывая, что я хочу использовать эти свойства в шаблоне для ToggleButton, который вложен в шаблон для Expander, я не могу использовать эти свойства таким образом.Поэтому мне также пришлось подтипить ToggleButton, определить свойства зависимостей для этого типа и заставить шаблон Expander передавать значения в шаблон ToggleButton.

Таким образом, я получил два новых типа впространство имен (вложение нового типа ToggleButton внутри подтипа Expander не сработало?), полная копия шаблона Expander с изменением только одной строки (где была вставлена ​​ToggleButton, проходящая через новые свойства), а затем фактическаяжелаемые изменения для шаблона ToggleButton.

И здесь возникает вопрос: есть ли способ сделать это менее сложным?Чтобы уменьшить объем работы, которую необходимо выполнить только для расширения подкомпонента чужого шаблона?Или просто способ использовать родительские свойства (Expander) внутри шаблона ToggleButton без необходимости его подтипа?

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Я закончил тем, что jberger предложил в комментариях:

Используя следующее выражение привязки, мне не нужно было дублировать свойства DependencyProperties в другой компонент для ToggleButton, но можно было просто получить доступ к свойствам Expander внутри вложенного шаблона:

{Binding CustomProperty, RelativeSource={RelativeSource
    FindAncestor, AncestorType=local:CustomExpander}}

К сожалению, но, как и ожидалось, никто не может повторно использовать части шаблона по умолчанию. Однако в этом случае я мог бы исключить детали из исходного шаблона, которые мне не понадобились в моей копии. Например, различные стили для расширения не по умолчанию (т.е. кроме Top), так как мой экспандер специализируется на этом макете.

Однако это сделало свойство ExpandDirection бесполезным, но я лично могу это принять. Это может привести к последующему вопросу, хотя; если лучше построить компонент с нуля (основываясь на базе Expander, а не на Expander).

0 голосов
/ 11 марта 2012

Я всегда гуглю стиль по умолчанию: Expander style wpf msdn. Это почти всегда приводит меня к правильной странице msdn, содержащей шаблон элемента управления по умолчанию и стиль элемента управления. На этот раз это привело меня к: http://msdn.microsoft.com/en-us/library/ms753296(v=vs.85).aspx

Редактировать (для уточнения):

Если мне нужно изменить элемент управления со сложным стилем, я копирую оригинальный или примерный стиль, предоставленный в MSDN, и изменяю его там, где мне нужно изменить, только потому, что это экономит мне много времени. Кроме того, я предоставил ссылку на версию стиля .NET 3.0, не без причины. Версия стиля .NET 4 использует VisualStateManager, что делает пример для некоторых людей, знакомых с WPF, слишком сложным для этой ситуации, даже Expression Blend 4 не генерирует VisualStateManager, а только известные триггеры. Просто для полноты: .NET 4: http://msdn.microsoft.com/en-us/library/ms753296(v=vs.100).aspx .NET 3.5: http://msdn.microsoft.com/en-us/library/ms753296(v=vs.90).aspx

...