Иерархия ресурсов и словари ресурсов

Последнее обновление: 11.02.2016

При определении и применении ресурсов следует учитывать их иерархию. Ресурсы элемента применяются только к вложенным элементам, но не к внешним контейнерам. Например, ресурс кнопки мы не можем использовать для грида, а только для тех элементов, которые будут внутри этой кнопки. Поэтому, как правило, большинство ресурсов определяются в коллекции Page.Resources в качестве ресурсов всей страницы, чтобы они были доступны для любого элемента данной страницы.

Но кроме определения ресурсов на уровне отдельных элементов страницы мы также можем определять ресурсы для всего приложения в целом, используя отдельные словари ресурсов.

Итак, нажмем правой кнопкой мыши на проект и в контекстном меню выберем Add -> New Item..., и в окне добавления выберем пункт Resource Dictionary:

Словари ресурсов в Universal Windows Platform

Оставим у него название по умолчанию 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>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850