Документация по Avalonia UI
< Все темы
Печать

Ресурсы

Часто стили и элементы управления должны совместно использовать ресурсы, такие как (но не ограничиваясь ими) кисти и цвета. Вы можете поместить такие ресурсы в словарь 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.

Оглавление