Главная » Разработка для Windows Phone 7 » Совместное использование кистей Windows Phone 7

0

Предположим, страница включает несколько TextBlock, и для Foreground всех этих элементов требуется применить LinearGradientBrush. Идеальное условие для использования ресурса.

Первый шаг – определение LinearGradientBrush в разделе ресурсов XAML-файла. Если ресурс задается в производном от FrameworkElement элементе, он должен быть описан до его применения, и доступ к нему имеет только данный или вложенный в него элемент.

<phone:PhoneApplicationPage.Resources> <LinearGradientBrush x:Key="brush">

<GradientStop Offset="0" Color="Pink" /> <GradientStop Offset="1" Color="SkyBlue" /> </LinearGradientBrush> </phone:PhoneApplicationPage.Resources>

Обратите внимание на атрибут x:Key. Каждый ресурс должен иметь имя ключа. Существует всего четыре ключевых слова, которые необходимо предварять «х». Мы уже видели три из них – x:Class, x:Name и x:Null – и x:Key четвертое.

Для реализации доступа к этому ресурсу предусмотрено несколько типов синтаксиса. Довольно развернутый способ – вынести свойство Foreground нашего TextBlock как свойство- элемент и задать в качестве его значения объект типа StaticResource, указывая имя ключа:

<TextBlock Text="Hello, Windows Phone 7!"> <TextBlock.Foreground>

<StaticResource ResourceKey="brush" /> </TextBlock.Foreground> </TextBlock>

Но есть и более краткий синтаксис, в котором используется так называемое расширение разметки XAML. Расширение разметки всегда заключается в фигурные скобки. Вот как выглядит расширение разметки для StaticResource:

<TextBlock Text="Hello, Windows Phone 7!"

Foreground="{StaticResource brush}" />

Обратите внимание, что в рамках расширения разметки слово «brush» используется без кавычек. Использование кавычек в расширении разметки запрещено.

Скажем, требуется сделать общим параметр Margin. Margin типа Thickness, и в XAML он может быть задан одним, двумя или четырьмя числами. Вот пример ресурса Thickness:

<Thickness x:Key="margin">

12 96 </Thickness>

Предположим, необходимо совместно использовать свойство FontSize. Это свойство типа double, и в этом случае нам понадобиться небольшая помощь. Структура Double, которая лежит в основе типа данных C# double, определена в пространстве имен System. Но описания пространств имен XML в обычном XAML-файле ссылаются только на классы Silverlight из пространств имен Silverlight. Нам требуется включить описание пространства имен XML для пространства имен System в корневой элемент страницы. Вот оно:

xmlns:system="clr-namespace:System;assembly=mscorlib"

Это стандартный синтаксис для ассоциирования пространства имен XML и пространства имен .NET. Прежде всего зададим для пространства имен XML имя, созвучное с пространством имен .NET. В данном случае подойдет «system» (некоторые разработчики используют «sys» или просто «s»). За написанным через дефис «clr-namespace» следуют двоеточие и имя пространства имен .NET. Если нас интересуют объекты текущей сборки, больше ничего делать не надо. В противном случае, ставим точку с запятой, «assembly=» и указываем необходимую сборку; здесь используется стандартная mscorlib.lib (Microsoft Common Runtime Library[9]).

Теперь мы можем определять ресурс типа double:

<system:Double x:Key="fontsize">

48

</system:Double>

Все эти три ресурса определяются в проекте ResourceSharing и используются в двух элементах TextBlock. Привожу здесь раздел ресурсов полностью:

Проект Silverlight: ResourceSharing Файл: MainPage.xaml (фрагмент)

<phone:PhoneApplicationPage.Resources> <LinearGradientBrush x:Key="brush">

<GradientStop Offset="0" Color=мpink" /> <GradientStop Offset="1" Color="SkyBlue" /> </LinearGradientBrush>

<Thickness x:Key=мmarginм>

12 96 </Thickness>

<system:Double x:Key="fontsize">

48

</system:Double> </phone:PhoneApplicationPage.Resources>

Сетка для содержимого включает два элемента TextBlock: Проект Silverlight: ResourceSharing Файл: MainPage.xaml (фрагмент)

<Grid x:Name=,,ContentPanel" Grid.Row=мlм Margin=мl2,0,12,0м> <TextBlock Text=мwhadayasay?м

Foreground="{StaticResource brush}" Margin="{StaticResource margin}" FontSize="{StaticResource fontsize}"

HorizontalAlignment="Left"

VerticalAlignment=мTopM />

<TextBlock Text="Fuhgedaboudit!"

Foreground="{StaticResource brush}" Margin="{StaticResource margin}" FontSize="{StaticResource fontsize}" HorizontalAlignment=мRightм VerticalAlignment=мBottomM />

</Grid>

Снимок экрана демонстрирует, как это выглядит в действии:

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

<Grid.Resources>

<Thickness x:Key="margin">9 6</Thickness> </Grid.Resources>

Этот ресурс переопределит тот, который задан в MainPage. Поиск ресурсов производится по имени ключа снизу вверх по дереву визуальных элементов, после чего выполняется поиск в коллекции Resources класса App. Поэтому коллекция Resources в App.xaml – замечательное место для размещения ресурсов, используемых всем приложением.

Если этот фрагмент разметки поместить в Grid под именем «LayoutRoot» (Корневой элемент разметки), он будет также доступен и элементам TextBlock, потому что они являются дочерними элементами этого Grid. Но если поместить разметку в StackPanel, озаглавленный «TitlePanel» (и заменить Grid на StackPanel), разметка будет проигнорирована. Поиск ресурсов производится вверх по дереву визуальных элементов, а это будет лишь другая ветвь по отношению к элементам TextBlock.

Этот фрагмент разметки будет также проигнорирован, если будет помещен в сетку для содержимого после описания элементов TextBlock. Сейчас он недоступен, потому что располагается после ссылки на него.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии