Table of Contents

Ресурсы, стили и темы

Стиль задаёт группу свойств каждому элементу управления, к которому применяется, поэтому внешний вид описывается один раз и используется повторно. Ресурсы хранят под ключом стили, шаблоны, кисти и любые другие значения. Тема — это словарь ресурсов со стилями для всех элементов управления; IcyUI поставляется с одной темой, и её можно заменить или расширить.

Ресурсы

У каждого элемента есть словарь Resources. {StaticResource Key} ищет ключ в ресурсах самого элемента, затем в каждом охватывающем элементе того же документа разметки и берёт первое совпадение. Ссылка разрешается один раз, при загрузке документа, поэтому объявляйте Resources до дочерних элементов, которые их используют; ненайденный ключ — ошибка разметки.

Словарь может объединять другие (MergedDictionaries), включая файлы словарей ресурсов, загруженные через конвейер ресурсов. Синтаксис описан в разделе Ресурсы и стили справочника по разметке.

Стили

У Style есть TargetType, значения свойств (его атрибуты в разметке) и необязательные визуальные состояния.

  • Неявный (без x:Key): применяется к каждому элементу управления именно этого типа в объявившем его элементе и ниже, если у элемента управления нет собственного стиля.
  • С ключом (x:Key): применяется там, где элемент управления его называет: Style="{StaticResource Key}".
  • BasedOn: стиль может взять значения другого стиля и изменить часть из них.
<!-- A keyed style based on another: BasedOn reuses its setters, and the theme still supplies the button's template. -->
<StackPanel Orientation="Vertical" Width="220">
  <StackPanel.Resources>
    <Style x:Key="MenuButton" TargetType="Button" Padding="24,8" HorizontalAlignment="Stretch" />
    <Style x:Key="DangerButton" TargetType="Button" BasedOn="{StaticResource MenuButton}" Background="#FFB03A3A" />
  </StackPanel.Resources>
  <Button Style="{StaticResource MenuButton}" Margin="0,0,0,8">Continue</Button>
  <Button Style="{StaticResource DangerButton}">Quit</Button>
</StackPanel>

Тема под стилями

Стили темы — это неявные стили всех встроенных элементов управления, их хранит Canvas. Ваш собственный стиль, с ключом или неявный, применяется поверх стиля темы для своего типа: тема даёт шаблон, цвета и визуальные состояния, а ваш стиль меняет только то, что задаёт сам. В примере DangerButton сохраняет шаблон кнопки из темы и меняет только фон, внутренние отступы и выравнивание. Группа визуальных состояний в вашем стиле с тем же именем, что и группа темы, заменяет эту группу (см. зачем нужны имена).

Чтобы полностью убрать внешний вид темы с элемента управления, задайте его стилю ReplacesTheme="True"; тогда стиль должен сам задать всё, включая шаблон.

Чтобы изменить внешний вид игры, наложите файл темы на встроенную тему методом ExtendDefaultTheme или замените тему методом UseThemeFile; см. Собственные темы.

Какое значение побеждает

Свойство может получить значение из нескольких мест. Побеждает самое высокое из имеющихся:

  1. локальное значение: задано у элемента в разметке или в коде;
  2. работающая анимация;
  3. активное визуальное состояние (наведение, нажатие, ...);
  4. стиль (ваш, поверх стиля темы);
  5. значение по умолчанию свойства.

Поэтому <Button Background="Red"/> остаётся красной при наведении (локальное значение сильнее визуального состояния), а значение, заданное в коде, сильнее стиля. Локальное значение, равное значению по умолчанию, тоже считается: HorizontalAlignment="Stretch" у кнопки отменяет центрирование из темы.

Типичные ошибки

  • Неявные стили совпадают только с точным типом. Стиль для Button не применяется к ToggleButton; задайте стиль каждому типу или постройте один на основе другого.
  • {StaticResource} не видит тему и Canvas. Он ищет в загружаемом документе; значения темы получайте через неявные стили.
  • Текстовые свойства не наследуются. FontSize или Foreground у панели не доходят до текста внутри неё; используйте неявный стиль TextBlock в ресурсах панели.

См. также