Введение в Microsoft Silverlight 2

Стили и шаблоны в Silverlight 2

Разбить на страницы
Показывать лекцию целиком

Silverlight предлагает множество элементов управления, они были рассмотрены в нескольких предыдущих лекциях, а также возможность создания собственных элементов управления. Все поставляемые элементы управления Silverlight уже по умолчанию выглядят гармонично и насыщенно, но если возникнет необходимость изменить их стандартный вид соответственно собственному дизайну, Silverlight 2 предлагает мощные возможности стилевого оформления и шаблонов, которые могут использоваться для изменения представления вашего приложения.

Понимание стилевого оформления

Чтобы понять, что такое стилевое оформление, рассмотрим простой пример использования кнопки в Silverlight-приложении. Далее представлен XAML для элемента управления Button:

<Canvas Background="LightBlue">
  <Button x:Name="btn" Content="Click Me!" Width = "140">
  </Button> 
</Canvas>

Это обеспечит отображение кнопки в стандартном стиле Silverlight (серебристого цвета, как будто с подсветкой сверху), как можно увидеть на рис. 12.1.

(рис 12.1) Базовая кнопка Silverlight

Как было показано в лекц. 7, "Элементы управления Silverlight: представления и компоновки", и в лекц. 8, "Элементы управления Silverlight: расширенные элементы управления", многие элементы управления Silverlight, включая Button, являются элементами управления с содержимым,т.е. могут формировать визуальное представление XAML-содержимого. В случае с Button это означает, что он может включать кое-что более интересное, чем просто строка "Click Me!" (Щелкни меня!), и что в него можно добавлять некоторую функциональность, обеспечивающую пользователю более широкие возможности при взаимодействии с этим элементом управления.

Например, создадим кнопку с изображением. Для этого используем изображение как содержимое кнопки. Например:

<Canvas Background="LightBlue"> 
  <Button Canvas.Left="40" Canvas.Top="40" x:Name="btn" 
         Width="60" Height="80"> 
    <Button.Content> 
      <StackPanel Orientation = "Vertical"> 
        <Image Source="icon.jpg" Height="48" 
                 Width = "48"> 
        </Image>
        <TextBlock Text="Click!"> </TextBlock> 
      </StackPanel> 
    </Button.Content> 
  </Button> 
</Canvas>

Как это выглядит на экране, представлено на рис. 12.2.

(рис 12.2) Кнопка, использующая XAML содержимое

Вас не устраивает стандартный шрифт и цвет надписи на кнопке, и вы хотите еще больше изменить ее внешний вид? Сделать это в XAML довольно просто. Можно задать свойства, включающие семейство шрифтов, размер, насыщенность и т.д., настраивающие внешний вид кнопки. Например, посмотрим на обновленный TextBlock:

<TextBlock Text="Click!" FontFamily="Comic Sans Ms" 
               Foreground="MediumBlue" FontSize="20"> 
</TextBlock>

Также добавим несколько других реализаций кнопки. В XAML это сделать довольно просто, потому что можно просто скопировать первую кнопку, а затем задать свойства расположения. Пример представлен на рис. 12.3.

(рис 12.3) Несколько экземпляров элемента управления Button

Выглядит славно и очень просто реализуется, но использование такого подхода приведет к разрастанию XAML и, что еще хуже, большому количеству повторяющегося кода, что усложнит проверку, отладку, обслуживание и обновление приложения.

Возьмем элементы управления TextBlock. Для каждого из них явно объявлены свойства FontFamily, Foreground и FontSize, несмотря на то, что всем им задано одно и то же значение. А что, если требуется изменить какое-то из этих значений. Придется просматривать каждый элемент управления один за другим, чтобы обновить их все.

Вот где возникает необходимость в стилях. Давайте рассмотрим, как вынести некоторые из этих данных в стиль.

Создание стиля

Стиль создается в разделе <Resources> (Ресурсы) контейнера. Здесь может быть создан один или более стилей, для которых задается имя стиля и тип объекта, к которому будет применяться стиль. Например, чтобы создать стиль TextBlockStyle (Стиль текстового блока) для элемента управления TextBlock, используется такой XAML:

<Style TargetType="TextBlock" 
            x:Key="TextBlockStyle"> 
</Style>

Для стиля задается тип элемента управления, к которому он может применяться. Однако то, что этот стиль предполагается для TextBlock, не означает, что все экземпляры TextBlock будут использовать его. Вы не ограничены одним стилем для одного типа. В стиле должен быть задан тип элемента управления, для которого предназначен стиль и Key (Ключ) стиля. Таким образом, можно иметь множество разных описаний стилей для элемента управления TextBlock с разными Key. Тогда, задавая свойство Style (Стиль) для разных TextBlock, вы просто выбираете тот стиль, который желаете применить к тому или иному TextBlock, по имени. Это будет продемонстрировано через мгновение, но сначала рассмотрим настройку стиля свойств TextBlock.

Это выполняется с помощью Setter (Установщик). Setter - это тег XAML, определяющий свойство и значение,которое необходимо задать этому свойству.

Далее представлен XAML, используемый ранее для задания свойств Text, FontFamily Foreground и Font-Size элемента TextBlock:

<TextBlock Text="Click!" FontFamily="Comic Sans Ms" 
           Foreground="MediumBlue" FontSize="20"> 
</TextBlock>

И вот теперь стиль, который делает то же самое:

<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>

Применяется этот стиль к TextBlock посредством свойства Style. Поскольку стиль определен как ресурс, для задания имени стиля используется синтаксис с ключевым словом StaticResource (Статический ресурс):

<TextBlock Style="{StaticResource TextBlockStyle}"> 
</TextBlock>

И теперь все свойства, применяемые к элементам управления TextBlock кнопки, задаются в одном месте, что значительно упрощает обслуживание и делает XAML удобным для восприятия и понимания.

Любое из свойств, определенных стилем, можно переопределить, просто задавая его в самом объекте. Например, требуется переопределить свойство Foreground, заданное стилем MediumBlue (Светло-синий). Сделать это очень просто, как показано в примере:

<TextBlock Style="{StaticResource TextBlockStyle}" 
         Foreground = "Black">
</TextBlock>

В этом случае, заданное здесь свойство Foreground переопределяет настройку стиля, и теперь для текста TextBlock будет использоваться черный цвет.

Также обратите внимание, что хотя стиль в данном примере определен для TextBlock, располагающегося в кнопке с изображением, он может применяться к любому TextBlock в данном Canvas.

Изменение области действия стиля

В примере из предыдущего раздела, стиль создавался в 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

(рис 12.4) Кнопки, заданные шаблоном

По-настоящему замечательное свойство шаблонов в том, что в шаблоне не обязательно присутствие типа элемента управления, шаблон которого создается. Вероятно, звучит немного запутанно, поэтому рассмотрим пример, чтобы разобраться во всем. Выше в этом разделе был определен шаблон для кнопки с содержимым, которое делает ее простой кнопкой с изображением. Но, чтобы создать шаблон кнопки, элемент управления 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).

(рис 12.5) Бескнопочные шаблоны для кнопки

Убедиться в том, что это настоящие кнопки, можно, попробовав написать код для них. Например, они имеют полную поддержку IntelliSense элемента управления Button в Microsoft Visual Studio. Это можно увидеть на рис. 12.6, где представлено написание кода для события Click.

(рис 12.6) Написание кода для кнопки, создаваемой по шаблону

Поскольку шаблоны - это просто особые стили, их тоже можно описывать в App.xaml, чтобы сделать доступными для применения на многих страницах XAML

Заключение

В данной лекции мы познакомились со стилями и шаблонами. Это очень важные возможности Silverlight, потому что они позволяют унифицировать и настраивать внешний вид и поведение всех создаваемых вами элементов управления. Вы научились объявлять стиль и использовать его как статический ресурс ( StaticResource ) элемента управления. Затем было показано, как использовать стиль во всем приложении, задавая его в App.xaml.

Наконец, вы увидели, как эта возможность может быть расширена с помощью шаблонов. Шаблоны аналогичны стилям, но позволяют описать стиль всего элемента управления. Был продемонстрирован ImageButton, созданный без использования Button, но все равно обладающий всеми свойствами, методами и событиями Button, благодаря объявлению ControlTemplate для него.

В следующей лекции будет представлен еще один аспект Silverlight 2 и более подробно рассмотрены элементы управления ASP.NET, предлагаемые в Silverlight SDK.

Страницы:

Silverlight предлагает множество элементов управления, они были рассмотрены в нескольких предыдущих лекциях, а также возможность создания собственных элементов управления. Все поставляемые элементы управления Silverlight уже по умолчанию выглядят гармонично и насыщенно, но если возникнет необходимость изменить их стандартный вид соответственно собственному дизайну, Silverlight 2 предлагает мощные возможности стилевого оформления и шаблонов, которые могут использоваться для изменения представления вашего приложения.

Понимание стилевого оформления

Чтобы понять, что такое стилевое оформление, рассмотрим простой пример использования кнопки в Silverlight-приложении. Далее представлен XAML для элемента управления Button:

<Canvas Background="LightBlue">
  <Button x:Name="btn" Content="Click Me!" Width = "140">
  </Button> 
</Canvas>

Это обеспечит отображение кнопки в стандартном стиле Silverlight (серебристого цвета, как будто с подсветкой сверху), как можно увидеть на рис. 12.1.

(рис 12.1) Базовая кнопка Silverlight

Как было показано в лекц. 7, "Элементы управления Silverlight: представления и компоновки", и в лекц. 8, "Элементы управления Silverlight: расширенные элементы управления", многие элементы управления Silverlight, включая Button, являются элементами управления с содержимым,т.е. могут формировать визуальное представление XAML-содержимого. В случае с Button это означает, что он может включать кое-что более интересное, чем просто строка "Click Me!" (Щелкни меня!), и что в него можно добавлять некоторую функциональность, обеспечивающую пользователю более широкие возможности при взаимодействии с этим элементом управления.

Например, создадим кнопку с изображением. Для этого используем изображение как содержимое кнопки. Например:

<Canvas Background="LightBlue"> 
  <Button Canvas.Left="40" Canvas.Top="40" x:Name="btn" 
         Width="60" Height="80"> 
    <Button.Content> 
      <StackPanel Orientation = "Vertical"> 
        <Image Source="icon.jpg" Height="48" 
                 Width = "48"> 
        </Image>
        <TextBlock Text="Click!"> </TextBlock> 
      </StackPanel> 
    </Button.Content> 
  </Button> 
</Canvas>

Как это выглядит на экране, представлено на рис. 12.2.

(рис 12.2) Кнопка, использующая XAML содержимое

Вас не устраивает стандартный шрифт и цвет надписи на кнопке, и вы хотите еще больше изменить ее внешний вид? Сделать это в XAML довольно просто. Можно задать свойства, включающие семейство шрифтов, размер, насыщенность и т.д., настраивающие внешний вид кнопки. Например, посмотрим на обновленный TextBlock:

<TextBlock Text="Click!" FontFamily="Comic Sans Ms" 
               Foreground="MediumBlue" FontSize="20"> 
</TextBlock>

Также добавим несколько других реализаций кнопки. В XAML это сделать довольно просто, потому что можно просто скопировать первую кнопку, а затем задать свойства расположения. Пример представлен на рис. 12.3.

(рис 12.3) Несколько экземпляров элемента управления Button

Выглядит славно и очень просто реализуется, но использование такого подхода приведет к разрастанию XAML и, что еще хуже, большому количеству повторяющегося кода, что усложнит проверку, отладку, обслуживание и обновление приложения.

Возьмем элементы управления TextBlock. Для каждого из них явно объявлены свойства FontFamily, Foreground и FontSize, несмотря на то, что всем им задано одно и то же значение. А что, если требуется изменить какое-то из этих значений. Придется просматривать каждый элемент управления один за другим, чтобы обновить их все.

Вот где возникает необходимость в стилях. Давайте рассмотрим, как вынести некоторые из этих данных в стиль.

Создание стиля

Стиль создается в разделе <Resources> (Ресурсы) контейнера. Здесь может быть создан один или более стилей, для которых задается имя стиля и тип объекта, к которому будет применяться стиль. Например, чтобы создать стиль TextBlockStyle (Стиль текстового блока) для элемента управления TextBlock, используется такой XAML:

<Style TargetType="TextBlock" 
            x:Key="TextBlockStyle"> 
</Style>

Для стиля задается тип элемента управления, к которому он может применяться. Однако то, что этот стиль предполагается для TextBlock, не означает, что все экземпляры TextBlock будут использовать его. Вы не ограничены одним стилем для одного типа. В стиле должен быть задан тип элемента управления, для которого предназначен стиль и Key (Ключ) стиля. Таким образом, можно иметь множество разных описаний стилей для элемента управления TextBlock с разными Key. Тогда, задавая свойство Style (Стиль) для разных TextBlock, вы просто выбираете тот стиль, который желаете применить к тому или иному TextBlock, по имени. Это будет продемонстрировано через мгновение, но сначала рассмотрим настройку стиля свойств TextBlock.

Это выполняется с помощью Setter (Установщик). Setter - это тег XAML, определяющий свойство и значение,которое необходимо задать этому свойству.

Далее представлен XAML, используемый ранее для задания свойств Text, FontFamily Foreground и Font-Size элемента TextBlock:

<TextBlock Text="Click!" FontFamily="Comic Sans Ms" 
           Foreground="MediumBlue" FontSize="20"> 
</TextBlock>

И вот теперь стиль, который делает то же самое:

<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>

Применяется этот стиль к TextBlock посредством свойства Style. Поскольку стиль определен как ресурс, для задания имени стиля используется синтаксис с ключевым словом StaticResource (Статический ресурс):

<TextBlock Style="{StaticResource TextBlockStyle}"> 
</TextBlock>

И теперь все свойства, применяемые к элементам управления TextBlock кнопки, задаются в одном месте, что значительно упрощает обслуживание и делает XAML удобным для восприятия и понимания.

Любое из свойств, определенных стилем, можно переопределить, просто задавая его в самом объекте. Например, требуется переопределить свойство Foreground, заданное стилем MediumBlue (Светло-синий). Сделать это очень просто, как показано в примере:

<TextBlock Style="{StaticResource TextBlockStyle}" 
         Foreground = "Black">
</TextBlock>

В этом случае, заданное здесь свойство Foreground переопределяет настройку стиля, и теперь для текста TextBlock будет использоваться черный цвет.

Также обратите внимание, что хотя стиль в данном примере определен для TextBlock, располагающегося в кнопке с изображением, он может применяться к любому TextBlock в данном Canvas.

Изменение области действия стиля

В примере из предыдущего раздела, стиль создавался в 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

(рис 12.4) Кнопки, заданные шаблоном

По-настоящему замечательное свойство шаблонов в том, что в шаблоне не обязательно присутствие типа элемента управления, шаблон которого создается. Вероятно, звучит немного запутанно, поэтому рассмотрим пример, чтобы разобраться во всем. Выше в этом разделе был определен шаблон для кнопки с содержимым, которое делает ее простой кнопкой с изображением. Но, чтобы создать шаблон кнопки, элемент управления 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).

(рис 12.5) Бескнопочные шаблоны для кнопки

Убедиться в том, что это настоящие кнопки, можно, попробовав написать код для них. Например, они имеют полную поддержку IntelliSense элемента управления Button в Microsoft Visual Studio. Это можно увидеть на рис. 12.6, где представлено написание кода для события Click.

(рис 12.6) Написание кода для кнопки, создаваемой по шаблону

Поскольку шаблоны - это просто особые стили, их тоже можно описывать в App.xaml, чтобы сделать доступными для применения на многих страницах XAML

Заключение

В данной лекции мы познакомились со стилями и шаблонами. Это очень важные возможности Silverlight, потому что они позволяют унифицировать и настраивать внешний вид и поведение всех создаваемых вами элементов управления. Вы научились объявлять стиль и использовать его как статический ресурс ( StaticResource ) элемента управления. Затем было показано, как использовать стиль во всем приложении, задавая его в App.xaml.

Наконец, вы увидели, как эта возможность может быть расширена с помощью шаблонов. Шаблоны аналогичны стилям, но позволяют описать стиль всего элемента управления. Был продемонстрирован ImageButton, созданный без использования Button, но все равно обладающий всеми свойствами, методами и событиями Button, благодаря объявлению ControlTemplate для него.

В следующей лекции будет представлен еще один аспект Silverlight 2 и более подробно рассмотрены элементы управления ASP.NET, предлагаемые в Silverlight SDK.

Вернуться к учебному плану