Главная > Silverlight > Применение в приложениях тем из Silverlight Toolkit

Применение в приложениях тем из Silverlight Toolkit

Есть такая замечательная штука как Silverlight Toolkit. Тулкит включает в себя множество полезных элементов управления, а также готовые темы для Silverlight приложений.

Вот примерный список тем:

  • Bubble Creme
  • Twilight Blue
  • Expression Dark
  • Expression Light
  • Whistler Blue
  • Bureau Black
  • Bureau Blue
  • Shiny Blue
  • Shiny Red
  • Rainier Purple
  • Rainier Orange

Как они выглядят Вы можете посмотреть, пройдя по ссылке в разделе «Theme Browser».

Итак, если Вы хотите, чтобы Ваши Silverlight приложения выглядели нестандартно, но не хотите создавать дизайн с нуля, выполните несколько простых действий:

  • Скачайте и установите Silverlight Toolkit
  • В окне Solution Explorer проекта Silverlight приложения выберите References -> Add Reference. Подключите библиотеку System.Windows.Controls.Theming и выбранную Вами тему. В данной демонстрации я использую тему Expression Dark.
  • На XAML странице, где Вы хотите использовать темы подключите XML пространства имён:
    xmlns:expDark=
    "clr-namespace:
    System.Windows.Controls.Theming;
    assembly=System.Windows.Controls.Theming.ExpressionDark"
    xmlns:theming=
    "clr-namespace:
    System.Windows.Controls.Theming;
    assembly=System.Windows.Controls.Theming.Toolkit"
  • Поместите элементы управления, к которым надо применить тему в тэг этой темы:

    <expDark:ExpressionDarkTheme>
      <Button Content="Счастье" Width="200" Height="50"
      FontSize="26" Margin="10"></Button>
    </expDark:ExpressionDarkTheme>
  • Наслаждайтесь новым видом Вашего приложения

Далее приведён исходный код приложения, показанного на скриншоте в начале статьи.
В этом приложении к элементам управления в левой части применена тема, а к элементам управления в правой нет.

<UserControl
xmlns:controls="clr-namespace:
System.Windows.Controls;assembly=System.Windows.Controls"
  x:Class="SilverlightApplication4.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:DesignWidth="640" d:DesignHeight="480"
  xmlns:expressionDark=
  "clr-namespace:System.Windows.Controls.Theming;
  assembly=System.Windows.Controls.Theming.ExpressionDark">
  <Grid x:Name="LayoutRoot">
    <StackPanel Orientation="Horizontal">
      <Grid Width="250">
        <expressionDark:ExpressionDarkTheme>
          <StackPanel Margin="5">
            <Button Margin="5" Content="Кнопка"/>
            <ComboBox Margin="5">
              <ComboBoxItem Content="Вариант №1" IsSelected="True"/>
            </ComboBox>
            <CheckBox Content="Чекбокс?"/>
            <Slider Margin="5"/>
          </StackPanel>
        </expressionDark:ExpressionDarkTheme>
      </Grid>
      <Grid Width="250">
        <StackPanel Margin="5">
          <Button Margin="5" Content="Кнопка"/>
          <ComboBox Margin="5">
            <ComboBoxItem Content="Вариант №1" IsSelected="True"/>
          </ComboBox>
          <CheckBox Content="Чекбокс?"/>
          <Slider Margin="5"/>
        </StackPanel>
      </Grid>
    </StackPanel>
  </Grid>
</UserControl>

Есть один нюанс. Если Вы используете элемент управления TabControl или некоторые другие, Вам надо будет установить автоматический режим применения тем для данного элемента управления:

theming:ImplicitStyleManager.ApplyMode="Auto"

Вот пример приложения где это используется:

<UserControl
xmlns:controls="clr-namespace:
System.Windows.Controls;assembly=System.Windows.Controls"
x:Class="SilverlightApplication4.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:DesignWidth="640" d:DesignHeight="480"
  xmlns:shRed="clr-namespace:
System.Windows.Controls.Theming;
assembly=System.Windows.Controls.Theming.ShinyRed"
  xmlns:
theming="clr-namespace:System.Windows.Controls.Theming;
assembly=System.Windows.Controls.Theming.Toolkit">
  <Grid x:Name="LayoutRoot">
    <shRed:ShinyRedTheme>
      <controls:TabControl
        theming:ImplicitStyleManager.ApplyMode="Auto"
        VerticalAlignment="Center" HorizontalAlignment="Center"
                 Width="440" Height="250">
        <controls:TabItem Header="Привет">
          <StackPanel Orientation="Horizontal">
            <Button Content="Счастье" Width="200"
Height="50" FontSize="26" Margin="10"></Button>
            <controls:Calendar Margin="10"></controls:Calendar>
          </StackPanel>
        </controls:TabItem>
        <controls:TabItem Header="Вторая вкладка">
        </controls:TabItem>
      </controls:TabControl>
    </shRed:ShinyRedTheme>
  </Grid>
</UserControl>
  1. 12 Август 2009 в 09:48 | #1

    Очень дельно, спасибо.

    А как насчёт динамического переключения тем в зависимости от настроек пользователя хранящихся, например, в IsolatedStorage – есть ли простой способ реализовать переключение тем?

    • 12 Август 2009 в 12:08 | #2

      Трудно сказать насчёт простого способа. Есть относительно простые.
      Например, можно создать UserControl, где распологается весь UI. Кодом добавлять на старницу нужную тему, а в неё уже UserControl.

      Как-то так:

      Theme theme = new ShinyRedTheme();
      theme.Content = new SilverlightControl1();
      LayoutRoot.Children.Add(theme);

      • 12 Август 2009 в 12:19 | #3

        Ну да – не слишком сложно в принципе.

        Но я думаю про что – нибудь типа вместо
        написать внутрь поместить UI а потом в коде через глобальный синглтон управлять поведением подменяя классы тем. Хотя это можно и к тому что вы написали применить:

        Theme theme = ThemeController.GetCurrentTheme();
        theme.Content = new SilverlightControl1();
        LayoutRoot.Children.Add(theme);

        Смену тем тогда можно будет осуществлять вот так:

        ThemeController.SetTheme(new ShinyRedTheme());

        похоже на правду?

        • 15 Август 2009 в 10:47 | #4

          Вообще хотелось бы найти способ заменять темы налету с помощью ImplicitStyleManager.
          Ваг способ мне тоже нравится. Должно получиться удобно.

  2. 12 Август 2009 в 09:49 | #5

    Теги, кстати, в жежешечке через зяпятую лушче ставить (;

  1. Пока что нет уведомлений.
Необходимо войти на сайт, чтобы написать комментарий.