Ресурсы
Часто стили и элементы управления должны совместно использовать ресурсы, такие как (но не ограничиваясь ими) кисти и цвета. Вы можете поместить такие ресурсы в словарь Resources, который доступен для каждого стиля и элемента управления, а затем ссылаться на эти ресурсы в другом месте.
Объявление ресурсов
Если ресурс должен быть доступен для всего вашего приложения, вы можете определить его в App.xaml
/App.axaml
:
<Application xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyApp.App"> <Application.Resources> <SolidColorBrush x:Key="Warning">Yellow</SolidColorBrush> </Application.Resources> </Application>
В качестве альтернативы вы можете объявить ресурсы в Window
или UserControl
: ресурс будет доступен для Window
/UserControl
и его дочерних элементов:
<UserControl xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyApp.MyUserControl"> <UserControl.Resources> <SolidColorBrush x:Key="Warning">Yellow</SolidColorBrush> </UserControl.Resources> </UserControl>
Или вообще в любой элемент управления
<Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyApp.MainWindow"> <StackPanel> <StackPanel.Resources> <SolidColorBrush x:Key="Warning">Yellow</SolidColorBrush> </StackPanel.Resources> </StackPanel> </Window>
Вы также можете объявить ресурсы в стилях:
<Style Selector="TextBlock.warn"> <Style.Resources> <SolidColorBrush x:Key="Warning">Yellow</SolidColorBrush> </Style.Resources> </Style>
Ссылка на ресурсы
Вы можете ссылаться на ресурсы из элементов управления, используя расширения разметки {DynamicResource}
, например:
<Border Background="{DynamicResource Warning}"> Look out! </Border>
В качестве альтернативы существует расширение разметки StaticResource
, которое имеет несколько ограничений по отношению к DynamicResource
:
- Не будет реагировать на изменения в ресурсе
- Ресурс должен быть объявлен в том же файле XAML.
В свою очередь, для StaticResource
не нужно добавлять обработчик событий для прослушивания изменений в ресурсах, что означает, что он использует немного меньше памяти.
Переопределение ресурсов
Ресурсы разрешаются путем обхода логического дерева от точки DynamicResource
или StaticResource
до тех пор, пока не будет найден ресурс с запрошенным ключом. Это означает, что ресурсы могут быть «переопределены» в поддеревьях приложения, например:
<UserControl xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyApp.MyUserControl"> <UserControl.Resources> <SolidColorBrush x:Key="Warning">Yellow</SolidColorBrush> </UserControl.Resources> <StackPanel> <StackPanel.Resources> <SolidColorBrush x:Key="Warning">Orange</SolidColorBrush> </StackPanel.Resources> <Border Background="{DynamicResource Warning}"> Look out! </Border> </StackPanel> </UserControl>
Здесь фон границы будет оранжевым, потому что его родительская панель StackPanel
«переопределила» ресурс Warning
с желтого, объявленного в пользовательском элементе управления.
Объединенные словари ресурсов
Свойство Resources
для каждого элемента управления и стиля имеет тип ResourceDictionary
. Словари ресурсов также могут включать в себя другие словари ресурсов, используя свойство MergedDictionaries
. Чтобы включить словарь ресурсов в другой, вы можете использовать класс ResourceInclude
, например:
<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceInclude Source='/AnotherResourceDictionary.xaml'/> </ResourceDictionary.MergedDictionaries> <SolidColorBrush x:Key="Warning">Yellow</SolidColorBrush> </ResourceDictionary> </Window.Resources>
Где AnotherResourceDictionary
— это XAML-файл с корнем ResourceDictionary
, включенный в приложение в качестве актива.
Разрешение ресурсов
Как упоминалось выше, ресурсы разрешаются путем обхода логического дерева от точки DynamicResource
или StaticResource
до тех пор, пока не будет найден ресурс с запрошенным ключом. Однако наличие стилей и объединенных словарей несколько усложняет задачу. Приоритет следующий:
- Ресурсы управления
- Объединенные словари
- Ресурсы стиля
- Объединенные словари
Для приведенного ниже примера приложения поиск ресурса для ресурса, определенного в элементе управления Border
, будет следовать порядку, указанному в скобках []
:
Application |- Resources [11] |- Merged dictionary [12] |- Merged dictionary [13] |- Styles |- Resources [14] |- Merged dictionary [15] |- Merged dictionary [16] Window |- Resources [6] |- Merged dictionary [7] |- Styles |- Resources [8] |- Merged dictionary [9] |- Merged dictionary [10] |- StackPanel |- Resources [1] |- Merged dictionary [2] |- Merged dictionary [3] |- Styles |- Resources [4] |- Merged dictionary [5] |- Border
Ресурсы тем
Темы обычно определяют кисти, цвета и другие настройки как ресурсы. Изменяя эти ресурсы, можно, например, переключиться с темной на светлую тему. Определенные ресурсы обычно относятся к используемой теме, например вы можете увидеть ресурсы, определенные темой Simple.