Ресурсы, стили и темы
Стиль задаёт группу свойств каждому элементу управления, к которому применяется, поэтому внешний вид описывается один раз и используется повторно. Ресурсы хранят под ключом стили, шаблоны, кисти и любые другие значения. Тема — это словарь ресурсов со стилями для всех элементов управления; 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; см. Собственные темы.
Какое значение побеждает
Свойство может получить значение из нескольких мест. Побеждает самое высокое из имеющихся:
- локальное значение: задано у элемента в разметке или в коде;
- работающая анимация;
- активное визуальное состояние (наведение, нажатие, ...);
- стиль (ваш, поверх стиля темы);
- значение по умолчанию свойства.
Поэтому <Button Background="Red"/> остаётся красной при наведении (локальное значение сильнее визуального
состояния), а значение, заданное в коде, сильнее стиля. Локальное значение, равное значению по умолчанию, тоже считается:
HorizontalAlignment="Stretch" у кнопки отменяет центрирование из темы.
Типичные ошибки
- Неявные стили совпадают только с точным типом. Стиль для
Buttonне применяется кToggleButton; задайте стиль каждому типу или постройте один на основе другого. {StaticResource}не видит тему и Canvas. Он ищет в загружаемом документе; значения темы получайте через неявные стили.- Текстовые свойства не наследуются.
FontSizeилиForegroundу панели не доходят до текста внутри неё; используйте неявный стильTextBlockв ресурсах панели.
См. также
- Шаблоны и визуальные состояния.
- Ресурсы и стили в справочнике по разметке.
- Кнопки — какие состояния использует стиль каждого элемента управления.