Применение тем к шаблону элемента управления

#silverlight #themes #controltemplate

#silverlight #темы #controltemplate

Вопрос:

По сути, моя проблема пока заключается в том, что я модифицирую шаблон элемента управления в поле со списком, чтобы он выглядел так, как я хочу. Кроме того, весь наш проект использует тему ExpressionDark. Проблема в том, что когда я устанавливаю стиль в поле со списком, чтобы он использовал мой измененный шаблон, его стиль ExpressionDark переопределяется.

Единственное решение, которое я мог придумать, это попытаться убрать любую явную раскраску в шаблоне, но это не сработало. Есть также OnApplyTemplate (), но я не уверен, как мне следует это использовать.

У кого-нибудь есть какие-нибудь советы о том, как я мог бы это сделать?

Спасибо

Ответ №1:

Вам нужно будет основывать свой пользовательский стиль на неявном стиле, применяемом выражением Dark theme. К элементу может быть применен только один неявный стиль. Кроме того, если вы явно зададите свойство Style, то неявный стиль применяться не будет.

Итак, если у вас есть неявный стиль для выражения Темная тема:

 <Style TargetType="ComboBox" ... />
  

И пользовательский стиль, подобный:

 <Style x:Key="MyStyle" TargetType="ComboBox" ... />
  

И используйте его следующим образом:

 <ComboBox Style="{StaticResource MyStyle}" ... />
  

Затем вам нужно будет изменить MyStyle, чтобы он основывался на неявном стиле, поэтому его настройки и триггеры также применяются следующим образом:

 <Style x:Key="MyStyle" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}" ... />
  

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

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

Поскольку вы используете Silverlight, x:Type часть не поддерживается. Вам нужно будет изменить выражение Темная тема, чтобы заставить это работать.

Итак, если у вас есть неявный стиль для выражения Темная тема:

 <Style TargetType="ComboBox" ... />
  

Вам нужно было бы разбить его на два Стиля следующим образом:

 <Style x:Key="ComboBoxBaseStyle" TargetType="ComboBox" ... />
<Style TargetType="ComboBox" BasedOn="{StaticResource ComboBoxBaseStyle}" />
  

Затем ваш пользовательский стиль необходимо будет изменить следующим образом:

 <Style x:Key="MyStyle" TargetType="ComboBox" BasedOn="{StaticResource ComboBoxBaseStyle}" ... />
  

В неявном стиле не должно быть никаких установщиков. Все должно быть сделано в версии ComboBoxBaseStyle.

Комментарии:

1. Ранее я рассматривал BasedOn, но я не думал об объединении его с x: Type. Однако проблема с этим подходом заключается в том, что я использую Silverlight : (Я имею в виду, что я все еще мог бы использовать свойство BasedOn, но я думаю, что мне нужно было бы явно ссылаться на стиль, но это в сборке, поэтому я не понимаю, как я это сделаю.

2. @Matt — Извините, не заметил, что у вас есть тег silverlight. x:Type Очевидно, что там это не сработает. Обновит ответ.

3. Возможно, я делаю что-то не так, но на самом деле это работает не так, как я ожидал… Я должен также упомянуть, что я создал шаблон элемента управления из самого Expression Blend. Шаблон элемента управления, созданный для создаваемого мной окна со списком, имеет явно определенные цветовые схемы (множество градиентов и т.д.). Честно говоря, кажется, что единственный способ заставить это работать без значительных изменений шаблона элемента управления — использовать BasedOn=»{somethingExpressionDark}» в (что бы это ни было) ComboBoxBaseStyle.