При определении и применении ресурсов следует учитывать их иерархию. Ресурсы элемента применяются только к вложенным элементам, но не к внешним контейнерам. Например, ресурс кнопки мы не можем использовать для грида, а только для тех элементов, которые будут внутри этой кнопки. Поэтому, как правило, большинство ресурсов определяются в коллекции Page.Resources в качестве ресурсов всей страницы, чтобы они были доступны для любого элемента данной страницы.
Но кроме определения ресурсов на уровне отдельных элементов страницы мы также можем определять ресурсы для всего приложения в целом, используя отдельные словари ресурсов.
Итак, нажмем правой кнопкой мыши на проект и в контекстном меню выберем Add -> New Item..., и в окне добавления выберем пункт Resource Dictionary:
Оставим у него название по умолчанию Dictionary1.xaml и нажмем на кнопку OK.
После этого в проект добавляется новый файл. Он представляет собой обычный xaml-файл с одним корневым элементом ResourceDictionary:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ResourceApp"> </ResourceDictionary>
Изменим его код, добавив какой-нибудь ресурс:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ResourceApp"> <LinearGradientBrush x:Key="buttonBrush"> <GradientStopCollection> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Gray" Offset="1" /> </GradientStopCollection> </LinearGradientBrush> </ResourceDictionary>
После определения файла ресурсов его надо подсоединить к ресурсам приложения. Для этого откроем файл App.xaml, который есть в проекте по умолчанию и изменим его:
<Application x:Class="ResourceApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ResourceApp" RequestedTheme="Light"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Dictionary1.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
Здесь элемент ResourceDictionary.MergedDictionaries
представляет коллекцию объектов ResourceDictionary, то есть словарей ресурсов,
которые добавляются к ресурсам приложения. Затем в любом месте приложения, например, в коде MainPage.xaml мы сможем сослаться на этот ресурс:
<Button Content="Hello" HorizontalAlignment="Center" Background="{StaticResource buttonBrush}" />
При этом мы можем добавлять в коллекцию ресурсов приложения одновременно множество других словарей или параллельно с ними определять еще какие-либо ресурсы:
<Application x:Class="ResourceApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ResourceApp" RequestedTheme="Light"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Dictionary1.xaml" /> <ResourceDictionary Source="Dictionary2.xaml" /> <ResourceDictionary Source="ButtonStyles.xaml" /> <SolidColorBrush Color="LimeGreen" x:Key="limeButton" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
Необязательно добавлять словарь ресурсов через ресурсы приложения. У объекта ResourceDictionary имеется свойство Source, через которое мы можем связать ресурсы конкретного элемента со словарем:
<Page x:Class="ResourceApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ResourceApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <ResourceDictionary Source="Dictionary1.xaml" /> </Page.Resources> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <Button Content="Hello" HorizontalAlignment="Center" Background="{StaticResource buttonBrush}" /> </Grid> </Page>