Расширение разметки {ThemeResource}
Предоставляет значение для любого атрибута XAML путем оценки ссылки на ресурс с дополнительной системной логикой, которая извлекает различные ресурсы в зависимости от активной темы. Как и расширение разметки {StaticResource}, ресурсы определяются в ResourceDictionary, а использование ThemeResource ссылается на ключ этого ресурса в ResourceDictionary.
Использование атрибутов XAML
<object property="{ThemeResource key}" .../>
Значения XAML
Срок | Description |
---|---|
ключ | Ключ для запрашиваемого ресурса. Этот ключ изначально назначается ResourceDictionary. Ключом ресурса может быть любая строка, определенная в грамматике XamlName. |
Замечания
ThemeResource — это метод получения значений для атрибута XAML, определенного в другом месте словаря ресурсов XAML. Расширение разметки служит той же основной целью, что и расширение разметки {StaticResource}. Разница в поведении с расширением разметки {StaticResource} заключается в том, что ссылка ThemeResource может динамически использовать различные словари в качестве основного расположения подстановки, в зависимости от того, какая тема в настоящее время используется системой.
При первом запуске приложения все ссылки на ресурсы, сделанные ссылкой ThemeResource , оцениваются на основе темы, используемой при запуске. Но если пользователь впоследствии изменяет активную тему во время выполнения, система повторно оценивает каждую ссылку ThemeResource , извлекает ресурс для конкретной темы, который может отличаться, и переиграет приложение с новыми значениями ресурсов во всех соответствующих местах визуального дерева. Статическийresource определяется во время загрузки XAML / запуск приложения и не будет повторно оцениваться во время выполнения. (Существуют другие методы, такие как визуальные состояния, которые динамически загружают XAML, но эти методы работают на более высоком уровне, что базовая оценка ресурсов включена Расширение разметки {StaticResource} ).
ThemeResource принимает один аргумент, указывающий ключ для запрошенного ресурса. Ключ ресурса всегда является строкой в среда выполнения Windows XAML. Дополнительные сведения о первоначальном указании ключа ресурса см. в атрибуте x:Key.
Дополнительные сведения о том, как определить ресурсы и правильно использовать ResourceDictionary, включая пример кода, см. в справочниках по ресурсам ResourceDictionary и XAML.
Важно, как и при использовании StaticResource, объект ThemeResource не должен пытаться выполнить перенаправленную ссылку на ресурс, определенный лексически в XAML-файле. Попытка сделать это не поддерживается. Даже если ссылка вперед не завершается неудачей, пытаясь сделать один несет штраф производительности. Для получения наилучших результатов настройте состав словарей ресурсов, чтобы избежать перенаправления ссылок.
Попытка указать ThemeResource ключу, который не может разрешить исключение синтаксического анализа XAML во время выполнения. Средства разработки также могут предлагать предупреждения или ошибки.
В реализации процессора XAML среда выполнения Windows не существует резервного представления класса для ThemeResource. Ближайшим эквивалентом в коде является использование API коллекции ResourceDictionary, например вызов Contains или *TryGetValue.
ThemeResource — это расширение разметки. Расширения разметки обычно реализуются, если требуется заменить значения атрибутов на нелитеральные значения или имена обработчиков и если требуется больше, чем простая настройка преобразователей типов на работу с определенными типами или свойствами. Все расширения разметки в XAML используют символы "{" и "}" в синтаксисе атрибутов, что является соглашением, с помощью которого обработчик XAML распознает, что расширение разметки должно обрабатывать атрибут.
Когда и как использовать {ThemeResource}, а не {StaticResource}
Правила, с помощью которых ThemeResource разрешает элемент в словаре ресурсов, обычно совпадают с статическимresource. Поиск ThemeResource может расшириться в файлы ResourceDictionary, на которые ссылается коллекция ThemeDictionaries, но СтатическийResource может сделать это также. Разница заключается в том, что ThemeResource может повторно оцениваться во время выполнения, и статическийResource не может.
Набор ключей в каждом словаре тем должен предоставлять одинаковый набор ключевых ресурсов независимо от активной темы. Если указанный ресурс с ключом существует в словаре тем HighContrast , другой ресурс с таким именем также должен существовать в Light и Default. Если это не так, поиск ресурсов может завершиться ошибкой, когда пользователь переключает темы, и ваше приложение не будет выглядеть правильно. Возможно, что словарь тем может содержать ключевые ресурсы, на которые ссылаются только те же области, чтобы предоставить вложенные значения; Они не должны быть эквивалентны во всех темах.
Как правило, следует размещать ресурсы в словарях тем и ссылаться на эти ресурсы с помощью ThemeResource , только если эти значения могут изменяться между темами или поддерживаются значениями, которые изменяются. Это подходит для таких типов ресурсов:
- Кисти, в частности цвета для SolidColorBrush. Они составляют около 80 % использования ThemeResource в шаблонах элементов управления XAML по умолчанию (generic.xaml).
- Значения пикселей для границ, смещения, поля и заполнения и т. д.
- Свойства шрифта, такие как FontFamily или FontSize.
- Полные шаблоны для ограниченного количества элементов управления, которые обычно являются системными и используются для динамической презентации, например GridViewItem и ListViewItem.
- Стили отображения текста (обычно для изменения цвета шрифта, фона и возможного размера).
Среда выполнения Windows предоставляет набор ресурсов, которые специально предназначены для ссылки на ThemeResource. Все они перечислены в составе файла XAML themeresources.xaml, который доступен в папке include/winrt/xaml/design в составе пакета SDK для Windows Software Development Kit( SDK). Документация по кисти темы и дополнительных стилей, определенных в themeresources.xaml, см. в ресурсах темы XAML. Кисти документируются в таблице, которая указывает, какое значение цвета каждая кисть имеет для каждой из трех возможных активных тем.
Определения визуальных состояний XAML в шаблоне элемента управления должны использовать ссылки ThemeResource всякий раз, когда есть базовый ресурс, который может измениться из-за изменения темы. Изменение системной темы обычно не приводит к изменению визуального состояния. Ресурсы должны использовать ссылки ThemeResource в этом случае, чтобы значения могли быть повторно оценены для состояния визуального элемента с поддержкой активности. Например, если у вас есть визуальное состояние, которое изменяет цвет кисти определенной части пользовательского интерфейса и одно из его свойств, а цвет кисти отличается для каждой темы, следует использовать ссылку ThemeResource для предоставления значения этого свойства в шаблоне по умолчанию, а также любых изменений визуального состояния в этом шаблоне по умолчанию.
Использование ThemeResource можно увидеть в ряде зависимых значений. Например, значение цвета, используемое SolidColorBrush, которое также является ключом ресурса, может использовать ссылку ThemeResource. Но все свойства пользовательского интерфейса, использующие ключ ресурс SolidColorBrush, также будут использовать ссылку ThemeResource, чтобы оно было специально для каждого свойства типа Кисти, которое позволяет изменять динамическое значение при изменении темы.
Примечание{ThemeResource}
и оценка ресурсов во время выполнения при переключении тем поддерживается в XAML Windows 8.1, но не поддерживается в XAML для приложений, предназначенных для Windows 8.
Системные ресурсы
Некоторые ресурсы темы ссылают значения системных ресурсов в качестве базового подзначаемого значения. Системный ресурс — это специальное значение ресурса, которое не найдено в словаре ресурсов XAML. Эти значения зависят от поведения в среда выполнения Windows поддержке XAML для пересылки значений из самой системы и представляют их в форме, на которую может ссылаться ресурс XAML. Например, существует системный ресурс с именем SystemColorButtonFaceColor, представляющий цвет RGB. Этот цвет исходит от аспектов системных цветов и тем, которые не только относятся к среда выполнения Windows и среда выполнения Windows приложениям.
Системные ресурсы часто являются базовыми значениями для темы высокой контрастности. Пользователь управляет выбором цвета для своей темы высокой контрастности, и пользователь делает эти варианты с помощью системных функций, которые также не относятся к среда выполнения Windows приложениям. Ссылаясь на системные ресурсы как ссылки ThemeResource, поведение тем высокой контрастности для приложений среда выполнения Windows может использовать эти значения, управляемые пользователем и предоставляемые системой. Кроме того, ссылки теперь помечены для повторной оценки, если система обнаруживает изменение темы во время выполнения.
Пример использования {ThemeResource}
Ниже приведен пример XAML, взятый из файлов generic.xaml и themeresources.xaml по умолчанию, иллюстрирующих использование ThemeResource. Мы рассмотрим только один шаблон (кнопка по умолчанию) и как объявляются два свойства (фон и передний план), чтобы реагировать на изменения темы.
<!-- Default style for Windows.UI.Xaml.Controls.Button -->
<Style TargetType="Button">
<Setter Property="Background" Value="{ThemeResource ButtonBackgroundThemeBrush}" />
<Setter Property="Foreground" Value="{ThemeResource ButtonForegroundThemeBrush}"/>
...
Здесь свойства принимают значение кисти и ссылку на ресурсы SolidColorBrush с именем ButtonBackgroundThemeBrush
и ButtonForegroundThemeBrush
создаются с помощью ThemeResource.
Эти же свойства также корректируются некоторыми визуальными состояниями для кнопки. В частности, цвет фона изменяется при нажатии кнопки. Здесь также анимации фона и переднего плана в раскадровке визуального состояния используют объекты DiscreteObjectKeyFrame и ссылки на кисти с ThemeResource в качестве значения ключевого кадра.
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
Storyboard.TargetProperty="Background">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedBackgroundThemeBrush}" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
Storyboard.TargetProperty="Foreground">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedForegroundThemeBrush}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
Каждая из этих кистей определена ранее в generic.xaml: они должны быть определены до любых шаблонов, использующих их, чтобы избежать перенаправления ссылок XAML. Ниже приведены эти определения для словаря тем по умолчанию.
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
...
<SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="#FFFFFFFF" />
...
<SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="#FF000000" />
...
Затем каждый из других словарей тем также имеет следующие кисти, например:
<ResourceDictionary x:Key="HighContrast">
<!-- High Contrast theme resources -->
...
<SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />
<SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="{ThemeResource SystemColorButtonTextColor}" />
...
<SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="{ThemeResource SystemColorButtonTextColor}" />
<SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />
Здесь значение color является еще одной ссылкой ThemeResource на системный ресурс. Если вы ссылаетесь на системный ресурс и хотите изменить его в ответ на изменение темы, следует использовать ThemeResource , чтобы сделать ссылку.
Поведение Windows 8
Windows 8 не поддерживает расширение разметки ThemeResource , оно доступно начиная с Windows 8.1. Кроме того, Windows 8 не поддерживает динамическое переключение ресурсов, связанных с темами для приложения среда выполнения Windows. Чтобы выбрать изменение темы для шаблонов и стилей XAML, приложение должно быть перезапущено. Это не хороший пользовательский интерфейс, поэтому приложения настоятельно рекомендуется перекомпилировать и использовать windows 8.1, чтобы они могли использовать стили с использованием ThemeResource и динамически переключать темы при выполнении пользователем. Приложения, скомпилированные для Windows 8, но работающие в Windows 8.1, продолжают использовать поведение Windows 8.
Поддержка средств разработки для расширения разметки {ThemeResource}
Microsoft Visual Studio 2013 может включать возможные значения ключей в раскрывающиеся списки Microsoft IntelliSense при использовании расширения разметки {ThemeResource} на странице XAML. Например, как только вы введите "{ThemeResource", отображаются все ключи ресурсов из ресурсов темы XAML.
После того как ключ ресурса существует в рамках любого использования {ThemeResource} , функция Go To Definition (F12) может разрешить этот ресурс и показать универсальный xaml для времени разработки, где определен ресурс темы. Так как ресурсы темы определяются несколько раз (для каждой темы) Перейти к определению , вы перейдете к первому определению, найденном в файле, который является определением по умолчанию. Если вы хотите, чтобы другие определения можно найти имя ключа в файле и найти определения других тем.