#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.