Применение в приложениях тем из 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>
Очень дельно, спасибо.
А как насчёт динамического переключения тем в зависимости от настроек пользователя хранящихся, например, в IsolatedStorage – есть ли простой способ реализовать переключение тем?
Трудно сказать насчёт простого способа. Есть относительно простые.
Например, можно создать UserControl, где распологается весь UI. Кодом добавлять на старницу нужную тему, а в неё уже UserControl.
Как-то так:
Theme theme = new ShinyRedTheme();
theme.Content = new SilverlightControl1();
LayoutRoot.Children.Add(theme);
Ну да – не слишком сложно в принципе.
Но я думаю про что – нибудь типа вместо внутрь поместить UI а потом в коде через глобальный синглтон управлять поведением подменяя классы тем. Хотя это можно и к тому что вы написали применить:
написать
Theme theme = ThemeController.GetCurrentTheme();
theme.Content = new SilverlightControl1();
LayoutRoot.Children.Add(theme);
Смену тем тогда можно будет осуществлять вот так:
ThemeController.SetTheme(new ShinyRedTheme());
похоже на правду?
Вообще хотелось бы найти способ заменять темы налету с помощью ImplicitStyleManager.
Ваг способ мне тоже нравится. Должно получиться удобно.
Теги, кстати, в жежешечке через зяпятую лушче ставить (;
Спасибо