Концепция ресурсов в Silverlight

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

Здесь под ресурсами подразумеваются не дополнительные файлы, как, например, аудиофайлы, файлы с изображениями, которые добавляются в проект. Silverlight. Это свойство включает коллекцию, точнее словарь (Resource dictionary) отдельных ресурсов. Каждый ресурс является каким-нибудь объектом, например, элемент управления, кисть, коллекция объектов и т.д. Смысл использования ресурсов в их гибкости, их можно многократно использовать в различных частях приложения, динамически менять. Кроме того, некоторые объекты, например, коллеции пользовательских типов невозможно в xaml-коде объявить иначе, как с помощью ресурсов.

Поскольку ресурсы содержатся в словаре, каждому присваивается уникальный ключ с помощью свойства x:Key. По этому ключу можно потом в коде найти ресурс.

Например, объявим кнопку в качестве ресурса и затем используем ее в проекте

<UserControl x:Class="TestApplication.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="200" d:DesignWidth="250">
    <UserControl.Resources>
        <RadialGradientBrush x:Key="R2D2Button">
            <GradientStopCollection>
                <GradientStop Color="Red" Offset="0.8"  />
                <GradientStop Color="Black" Offset="1" />
            </GradientStopCollection>
        </RadialGradientBrush>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <Button Height="40" Width="100" VerticalAlignment="Center" Content="Hello World" Background="{StaticResource R2D2Button}" />
    </Grid>
</UserControl>

В данном случае мы создаем ресурс с ключом x:Key="R2D2Button" и затем присваиваем этот ресурс свойству Background кнопки в проекте.

Ресурсы могут объявляться внутри различных элементов управления - UserControl, Grid, Button. Также возможно определение ресурсов для все приложения в файле xaml-разметки приложения.

Общий синтаксис задания ресурса в качестве значения свойства объекта такой: в фигурных скобках после ключевого слова StaticResource или DynamicResource идет ключ ресурса:

Свойство="{StaticResource ключ_ресурса}"

Мы можем получить объект ресурса, обратившись к коллекции ресурсов и получив из нее по ключу нужный объект:

RadialGradientBrush rdb = (RadialGradientBrush)this.Resources["R2D2Button"];

В то же время мы не можем изменить ресурс или присвоить ему новый объект, так как, в отличие от WPF, Silverlight не поддерживает динамические ресурсы.

Словари ресурсов

Кроме прописывания ресурсов на уровне определенного элемента, например, UserControl или Grid, можно воспользоваться словарем ресурсов. Для этого надо добавить в проект новый объект под названием Resource Dictionary. Он представляет собой обычный xaml-файл.

Нажмите правой кнопкой на название проекта и выберите в пункт Add->New Item.... Затем среди шаблонов выберите Silverlight Resource Dictionary. Выберите имя Dictionary1.xaml и нажмите OK. В проект будет добавлен словарь ресурсов. Теперь вынесем ресурс кисти с радиальным градиентом из ресурсов UserControl в наш словарь ресурсов:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <RadialGradientBrush x:Key="R2D2Button">
        <GradientStopCollection>
            <GradientStop Color="Red" Offset="0.8"  />
            <GradientStop Color="Black" Offset="1" />
        </GradientStopCollection>
    </RadialGradientBrush>
</ResourceDictionary>

Если наш словарь находится в файле Dictionary1.xaml, то его можно подключить в файле разметки приложения таким способом:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             x:Class="TestApplication.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Запустите проект и вы увидите, что несмотря на то, что мы удалили ресурсы UserControl из разметки, кнопка все равно применяет ресурс, но теперь уже из словаря ресурсов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850