Стили и шаблоны в Silverlight 2
Изменение области действия стиля
В примере из предыдущего раздела, стиль создавался в Canvas, содержащем элементы управления. Это ограничивает область действия этого стиля данным Canvas. Поэтому если в приложении имеется несколько страниц, пришлось бы определять стили на каждой страницы, что весьма неэффективно.
К счастью, Silverlight позволяет описывать стили для всего приложения, задавая их в App.xaml. В стандартном файле App.xaml, создаваемом шаблоном Visual Studio, уже определен раздел Resources!
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xam l" x:Class="SilverlightApplication1.App"> <Application.Resources> </Application.Resources> </Application>
Итак, размещенные здесь описания стилей будут доступны всему приложению. Рассмотрим пример:
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xam l" x:Class="SilverlightApplication1.App"> <Application.Resources> <Style TargetType="TextBlock" x:Key="TextBlockStyle"> <Setter Property="FontFamily" Value="Comic Sans Ms"> </Setter> <Setter Property="Text" Value="Click!"> </Setter> <Setter Property="Foreground" Value="MediumBlue"> </Setter> <Setter Property="FontSize" Value="20"> </Setter> </Style> </Application.Resources> </Application>
Применяя этот стиль, можно задавать стиль любого TextBlock в приложении, используя один и тот же синтаксис. Точно также можно переопределить любое из свойств Style, задавая их для конкретного элемента управления.
Шаблоны
В предыдущем разделе была создана кнопка с изображением и использован факт, что кнопка является элементом управления с содержимым. Это позволило создать не просто кнопку с надписью, а включить в нее XAML, описывающий StackPanel с изображением ( Image ) и текстовым блоком ( TextBlock ). Затем вы научились с помощью стилей эффективно применять единообразные настройки к свойствам нескольких элементов TextBlock.
Следующий логический шаг - определение стиля сразу всего элемента управления, состоящего из Button и образующих его элементов управления, т.е. StackPanel, Image и TextBlock. Вот где шаблоны становятся основными средствами настройки внешнего вида ваших Silverlight-приложений!
Шаблоны действуют абсолютно аналогично стилям: размещаются в разделе Resources и описываются с помощью Setter. Чтобы создать Template (Шаблон), задается свойство Template и затем с помощью <Setter.Value> определяется ControlTemplate для заданного элемента управления:
Проще в этом разобраться, взглянув на код:
<Canvas.Resources> <Style TargetType="TextBlock" x:Key="TextBlockStyle"> <Setter Property="FontFamily" Value="Comic Sans Ms"> </Setter> <Setter Property="Text" Value="Click!"> </Setter> <Setter Property="Foreground" Value="MediumBlue"> </Setter> <Setter Property="FontSize" Value="20"> </Setter> </Style> <Style x:Key="ImageButton" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Button > <Button.Content> <StackPanel Orientation="Vertical"> <Image Source="icon.jpg" Height="48" Width="48"> </Image> <TextBlock Style="{StaticResource TextBlockStyle}" Foreground = " Black" > </TextBlock> </StackPanel> </Button. Content > </Button> </ControlTemplate> </Setter.Value> </Setter> </Style> </Canvas.Resources>
Здесь создается стиль ImageButton, в котором используется Setter для свойства Template. В нем содержится ControlTemplate, описывающий Button, которую мы видели ранее, включающую StackPanel с Image и TextBlock.
Обратите внимание, что здесь также может использоваться ссылка на стиль, потому что для элемента управления TextBlock, используемого в шаблоне, задан созданный ранее стиль TextBlockStyle.
Теперь XAML для объявления кнопок стал еще проще:
<Button x:Name="btn1" Style="{StaticResource ImageButton}" Canvas.Top="20" Canvas.Left="20"> </Button> <Button x:Name="btn2" Style="{StaticResource ImageButton}" Canvas.Top="20" Canvas.Left="120"> </Button> <Button x:Name="btn3" Style="{StaticResource ImageButton}" Canvas.Top="20" Canvas.Left="220"> </Button>
Для каждой кнопки в качестве значения Style задан ресурс ImageButton, который, в свою очередь, определяет шаблон для всего элемента управления. На рис. 12.4 показан результат выполнения этого XAML
По-настоящему замечательное свойство шаблонов в том, что в шаблоне не обязательно присутствие типа элемента управления, шаблон которого создается. Вероятно, звучит немного запутанно, поэтому рассмотрим пример, чтобы разобраться во всем. Выше в этом разделе был определен шаблон для кнопки с содержимым, которое делает ее простой кнопкой с изображением. Но, чтобы создать шаблон кнопки, элемент управления Button, по сути, не нужен. Можно без труда создать кнопки с изображением и текстом, не беря за основу стандартный элемент управления Button. Рассмотрим шаблон:
<Style x:Key="ImageButton" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <StackPanel Orientation = "Vertical"> <Image Source="icon.jpg" Height="48" Width="48"> </Image> <TextBlock Style="{StaticResource TextBlockStyle}" Foreground = "Black" > </TextBlock> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style>
Таким образом, мы получили шаблон (заданный с помощью TargetType ) вообще без элемента управления Button, но Silverlight будет интерпретировать его как кнопку, включая все соответствующие свойства и события. Например, если применить этот шаблон (бескнопочный), при выполнении приложения на экране можно будет увидеть примерно следующее (рис. 12.5).
Убедиться в том, что это настоящие кнопки, можно, попробовав написать код для них. Например, они имеют полную поддержку IntelliSense элемента управления Button в Microsoft Visual Studio. Это можно увидеть на рис. 12.6, где представлено написание кода для события Click.
Поскольку шаблоны - это просто особые стили, их тоже можно описывать в App.xaml, чтобы сделать доступными для применения на многих страницах XAML
Заключение
В данной лекции мы познакомились со стилями и шаблонами. Это очень важные возможности Silverlight, потому что они позволяют унифицировать и настраивать внешний вид и поведение всех создаваемых вами элементов управления. Вы научились объявлять стиль и использовать его как статический ресурс ( StaticResource ) элемента управления. Затем было показано, как использовать стиль во всем приложении, задавая его в App.xaml.
Наконец, вы увидели, как эта возможность может быть расширена с помощью шаблонов. Шаблоны аналогичны стилям, но позволяют описать стиль всего элемента управления. Был продемонстрирован ImageButton, созданный без использования Button, но все равно обладающий всеми свойствами, методами и событиями Button, благодаря объявлению ControlTemplate для него.
В следующей лекции будет представлен еще один аспект Silverlight 2 и более подробно рассмотрены элементы управления ASP.NET, предлагаемые в Silverlight SDK.