Лекция 8: Реализация пользовательского интерфейса. Элементы управления. Стили. Ресурсы
Ресурсы
Выше говорилось о возможности создания стилей. Которые, как было отмечено, не должны входить в дерево XAML-элементов. Все стили записывали внутри свойства Resources, принадлежащего объекту Page. Подобное свойство есть у всех объектов XAML, порожденных от FrameworkElement, а также у объекта приложения (Application). Благодаря ресурсам разработчик может сохранять стили и другие части XAML-кода до востребования. Так, в ресурсы можно выделять объекты некоторых типов, стили, шаблоны данных и др. Фактически, свойство Resources ссылается на некий словарь, который может быть доступен как из кода, так и из XAML.
Если используются ресурсы на уровне приложения, то доступ к ресурсу может быть осуществлён лишь по ключу, вне зависимости от того, в каком из родительских элементов объявлен ресурс. Если же ресурс был объявлен в одном из дочерних элементов, то он не может использоваться родительскими элементами.
Рассмотрим небольшой пример.
<Page.Resources> <LinearGradientBrush x:Key="myBrush"> <GradientStop Color="Red" Offset="0"></GradientStop> <GradientStop Color="Green" Offset="1"></GradientStop> </LinearGradientBrush> </Page.Resources> <StackPanel> <Button Width="100" Height="50" Background="{StaticResource myBrush}" Content="Button 1" Margin="5"> </Button> </StackPanel>
Здесь определили в роли ресурса градиентную кисть, указав в качестве ключа (он же является именем) myBrush. Данный ключ будет использоваться для доступа к ресурсу. Как Вы могли заметить, доступ к ресурсу определяется с помощью расширения разметки StaticResource. Достаточно указать имя ключа в качестве параметра.
В примере выше разместили ресурсы внутрь элемента Page, который является контейнером для интерфейса. Это обеспечивает видимость ресурсов для любого дочернего элемента. Если мы хотим ограничить область видимости, то ресурсы можно разместить в любом из дочерних элементов, например в StackPanel.
<StackPanel> <StackPanel.Resources> <LinearGradientBrush x:Key="myBrush"> <GradientStop Color="Red" Offset="0"></GradientStop> <GradientStop Color="Green" Offset="1"></GradientStop> </LinearGradientBrush> </StackPanel.Resources> <Button Width="100" Height="50" Background="{StaticResource myBrush}" Content="Button 1" Margin="5"> </Button> </StackPanel>
Таким образом, для конечного элемента управления нет никакой разницы, где находятся ресурсы. Главное, чтобы они были в области видимости элемента, а доступ к ним осуществляется по одинаковой схеме.
Наконец, если необходимо обеспечить ресурсам глобальную область видимости, то можете разместить их на уровне всего приложения. Такой подход очень эффективен при разработке сложных приложений, то есть приложений, обладающих несколькими окнами и механизмом навигации между ними. Вот пример определения этих же ресурсов внутри файла приложения.
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Application4"> <Application.Resources> <LinearGradientBrush x:Key="myBrush"> <GradientStop Color="Red" Offset="0"></GradientStop> <GradientStop Color="Green" Offset="1"></GradientStop> </LinearGradientBrush> </Application.Resources> </Application>
Выделение ресурсов объектов в отдельные файлы
Ресурсы можно хранить в отдельных файлах и собирать в нужном месте с помощью элемента ResourceDictionary. Вынесем кисть из предыдущего примера в отдельный файл RD1.xaml.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <LinearGradientBrush x:Key="myBrush"> <GradientStop Color="Red" Offset="0"></GradientStop> <GradientStop Color="Green" Offset="1"></GradientStop> </LinearGradientBrush> </ResourceDictionary>
Для подключения внешнего файла к интерфейсу приложения используется все тот же ResourceDictionary.
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Application4"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="RD1.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
Если у вас несколько файлов - не проблема. Перечислите их все. Обратите внимание, что стандартный файл StandardStyles.xaml как раз и оформлен как внешний файл ресурсов, который подключается внутри файла App.xaml.
Если Вы хотите подключить файл с ресурсами в ресурсы одного из элементов, то это делается аналогичным образом.
Краткие итоги
Рассмотрен процесс создания пользовательских интерфейсов с использованием языка разметки XAML. Рассмотрены примеры реализации фрагментов проектов для реализации интерфейсов приложения WinRT.
Вопросы
- Какие языки используются для написания приложений для Windows Store?
- Какие платформы используются для написания приложений для Windows Store?
- В чем отличие языка XAML от других языков разметки?
- Что собой представляют объектные элементы XAML?
- Как записывается синтаксис объектных элементов XAML?
- Как записывается синтаксис атрибутов объектного элемента?
- Для чего используется синтаксис элементов свойств?
- Приведите примеры синтаксис элементов свойств.
- Приведите примеры наиболее распространенных расширений разметки, используемыми при программировании приложений WPF.