Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Работа с объектными (логическими) ресурсами
При построении приложения WPF часто приходится определять большой объем разметки XAML для использования во многих местах окна или возможно во множестве окон либо проектов. Например, пусть создана "безупречная" кисть с линейным градиентом, определение которой в разметке занимает 10 строк. Теперь кисть необходимо применить в качестве фонового цвета для каждого элемента
Button
Button
Худшее, что можно было бы предпринять — копировать и вставлять одну и ту же разметку XAML в каждый элемент управления
Button
К счастью, объектные ресурсы позволяют определить фрагмент разметки XAML, назначить ему имя и сохранить в подходящем словаре для использования в будущем. Подобно двоичным ресурсам объектные ресурсы часто компилируются в сборку, где они требуются. Однако в такой ситуации нет необходимости возиться со свойством Build Action. При условии, что разметка XAML помещена в корректное местоположение, компилятор позаботится обо всем остальном.
Взаимодействие с объектными ресурсами является крупной частью процесса разработки приложений WPF. Вы увидите, что объектные ресурсы могут быть намного сложнее, чем специальная кисть. Допускается определять анимацию на основе XAML, трехмерную визуализацию, специальный стиль элемента управления, шаблон данных, шаблон элемента управления и многое другое, и упаковывать каждую сущность в многократно используемый ресурс.
Роль свойства Resources
Как уже упоминалось, для применения в приложении объектные ресурсы должны быть помещены в подходящий объект словаря. Каждый производный от
FrameworkElement
Resources
ResourceDictionary
ResourceDictionary
System.Object
В инфраструктуре WPF все элементы управления плюс элементы
Window
Page
UserControl
FrameworkElement
ResourceDictionary
Application
FrameworkElement
Определение ресурсов уровня окна
Чтобы приступить к исследованию роли объектных ресурсов, создайте в Visual Studio новый проект приложения WPF по имени
ObjectResourcesApp
Grid
StackPanel
Button
<StackPanel Orientation="Horizontal">
<Button Margin="25" Height="200" Width="200" Content="OK" FontSize="20"/>
<Button Margin="25" Height="200" Width="200" Content="Cancel" FontSize="20"/>
</StackPanel>
Выберите кнопку OK и установите в свойстве
Background
<Button>
</Button>
<Button Margin="25" Height="200" Width="200" Content="OK" FontSize="20">
<Button.Background>
<RadialGradientBrush>
<GradientStop Color="#FFC44EC4" Offset="0" />
<GradientStop Color="#FF829CEB" Offset="1" />
<GradientStop Color="#FF793879" Offset="0.669" />
</RadialGradientBrush>
</Button.Background>
</Button>
Чтобы разрешить использовать эту кисть также и в кнопке Cancel (Отмена), область определения
RadialGradientBrush
RadialGradientBrush
StackPanel
Когда необходимо определить ресурс, для установки свойства
Resources
х:Кеу
х:Key
х:Name
х:Name
х:Кеу
Среда Visual Studio позволяет переместить ресурс на более высокий уровень с применением соответствующего окна Properties. Чтобы сделать это, сначала понадобится идентифицировать свойство, имеющее сложный объект, который необходимо упаковать в виде ресурса (свойство
Background