Silverlight4中实现Theme的动态切换
Silverlight一般用来开发一些企业的应用系统,如果用户一直面对同一种风格的页面,时间长了难免厌烦,所以一般都会提供好几种风格及Theme供用户选中,下面就来说一下如何在不重新登录系统的情况下,实现风格的动态切换。我们写一个Demo来说明一下。
新建一个Silverlight的项目,并添加一个默认的站点,先来写一下页面吧,简单起见,只放两个控件,MainPage的代码如下:
<UserControl x:Class="SilverlightChangeTheme.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:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White">
<Button Content="ChangeTheme" Height="23" HorizontalAlignment="Left"
Margin="40,66,0,0" Name="button1" VerticalAlignment="Top"
Width="108" Click="button1_Click" Style="{StaticResource BtnStyle}" />
<TextBlock Height="23" HorizontalAlignment="Left"
Margin="58,37,0,0" Name="textBlock1"
Text="文字样式" VerticalAlignment="Top"
FontSize="14" Width="101" Style="{StaticResource txtStyle}" />
</Grid>
</UserControl>
效果图如下:

就是一个简单的按钮和一个TextBlock,下面要实现的效果是点击按钮实现文字和按钮字体颜色改变(样式要从资源文件加载);
那么既然要实现切换风格,首先要有资源文件,我们先建两个Silverlight Resource Dictionary,红色风格和蓝色风格,命名为Blue.xaml和Red.xaml,代码如下:
Red.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style TargetType="Button" x:Key="BtnStyle">
<Setter Property="Foreground" Value="Red" />
</Style>
<Style TargetType="TextBlock" x:Key="txtStyle">
<Setter Property="Foreground" Value="Red" />
</Style>
</ResourceDictionary>
Blue.xaml:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style TargetType="Button" x:Key="BtnStyle">
<Setter Property="Foreground" Value="Blue" />
</Style>
<Style TargetType="TextBlock" x:Key="txtStyle">
<Setter Property="Foreground" Value="Blue" />
</Style>
</ResourceDictionary>
由于MainPage中已经绑定了资源文件中的样式,所以系统启动时就必须加载某一个样式文件,就是所谓的默认样式,所以要加一个静态类,来实现系统启动时加载默认样式和切换样式,代码如下:
ThemeHelper.cs
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes; namespace SilverlightChangeTheme
{
public static class ThemeHelper
{
/// <summary>
/// 加载样式文件到Application.Current.Resources
/// </summary>
/// <param name="theme"></param>
public static void LoadTheme(string theme)
{
ResourceDictionary rd = new ResourceDictionary();
if (theme.Length == )
{
Application.LoadComponent(rd, new Uri("/SilverlightChangeTheme;component/Red.xaml", UriKind.Relative));
}
else
{
Application.LoadComponent(rd, new Uri("/SilverlightChangeTheme;component/Blue.xaml", UriKind.Relative));
}
//清空Application.Current.Resources,存放新的样式
if (Application.Current.Resources.Count > )
{
Application.Current.Resources.Clear();
}
Application.Current.Resources.MergedDictionaries.Add(rd);
} /// <summary>
/// 从Application.Current.Resources中获取指定名称的样式
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static object FindResource(string name)
{
if (App.Current.Resources.Contains(name))
{
return App.Current.Resources[name];
}
else
{
return null; //这里返回NULL,如果没有控件会变成系统默认样式。
}
}
}
}
然后在App.xaml.cs中,在Application_Startup方法中添加如下代码:
private void Application_Startup(object sender, StartupEventArgs e)
{
//加载默认样式
ThemeHelper.LoadTheme("Blue");
this.RootVisual = new MainPage();
}
这样启动时就会自动加载蓝色的风格了,效果图下:

然后,给MainPage的Button添加事件,实现样式的切换,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes; namespace SilverlightChangeTheme
{
public partial class MainPage : UserControl
{
bool IsRed = false;
public MainPage()
{
InitializeComponent();
} private void button1_Click(object sender, RoutedEventArgs e)
{
if (IsRed)
{
//加载样式到Application.Current.Resources
ThemeHelper.LoadTheme("Blue");
IsRed = false;
}
else
{
//加载样式到Application.Current.Resources
ThemeHelper.LoadTheme("Red");
IsRed = true;
}
//运行时,更新样式必须重新设置每个控件的Style,然后调用this.UpdateLayout()方法更新页面。
button1.Style = ThemeHelper.FindResource("BtnStyle") as Style;
textBlock1.Style = ThemeHelper.FindResource("txtStyle") as Style;
this.UpdateLayout();
}
}
}
这样就实现了样式的切换,需要注意的是系统启动后切换样式,要在代码中重新设置每个控件的Style,然后调用this.UpdateLayout()方法更新页面。
当然,如果有多窗体的话,没有打开的话是不需要设置的,只需要设置已经显示的控件。
补充知识:
关于Uri路径的写法。
XAML文件的相对Uri访问, 如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />,
在子文件夹里的可以用<Image Source=”./images/sl.jpg” />访问到
最保险的方式是采用特有的程序集资源URI访问,格式为
<Image Source="/{assemblyShortName};component/Foo.jpg"/>, 这种方式还可以引用到xap中的其他程序集中的图片
修改我们的两个图片的引用方式为
<Image Source="/SilverlightApplication1;component/silverlight.png"/>
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/> Silverlight4中实现Theme的动态切换的更多相关文章
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- ionic 运行过程中动态切换API服务器地址
ionic 运行过程中动态切换API服务器地址 keywords: ionic,phonegap,cordova,网络制式,动态切换,变更,API,服务器地址,$resource,localstora ...
- 动态切换 web 报表中的统计图类型
统计图在浏览器端展现时,不同的使用人员对图形的展现形式会有不同的要求,有的需要柱形图.有的想看折线图等,报表支持用户在浏览器端动态的选择统计图类型,关注乾学院,查看具体实现方法动态切换 web 报表中 ...
- 动态切换tableView中的cell的种类
动态切换tableView中的cell的种类 为什么要动态切换tableView中cell的种类呢?如果项目经理不出这种需求,你也就见不到这篇文章了:) 效果: 源码: 首先,你要准备3种cell,直 ...
- springboot 1.5.x中的动态切换日志级别
logback是一套日志框架,由log4j的优化版,由同一个作者开发,在速度和性能上都超过其他日志框架,再结合slf4j,已成为当前最流行的日志框架. 一.springboot中使用logback s ...
- ExtJS动态切换主题
ExtJS动态切换主题 在Sencha Cmd构建的Ext程序中怎么去动态切换主题,目前看好像只能单一切换,但是在官网文档找到了答案 Resource Management在上一节通过 ...
- spring+mybatis多数据源动态切换
spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web. ...
- Spring AOP动态切换数据源
现在稍微复杂一点的项目,一个数据库也可能搞不定,可能还涉及分布式事务什么的,不过由于现在我只是做一个接口集成的项目,所以分布式就先不用了,用Spring AOP来达到切换数据源,查询不同的数据库就可以 ...
随机推荐
- Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- 初识C语言
C语言是开发iOS软件的基础. 一.C语言简介 1. 简史 1) C语言于1972年发明,首次使用是用于重写UINX操作系统(UNIX以前主要是用汇编语言写的,它奠定了操作 ...
- 【Java学习笔记】静态导入
package p2; //import static java.util.Collections.max; import java.util.ArrayList; import static jav ...
- session和cookie的简单理解
0. 引子,我们为什么要cookie和session 因为http请求是无状态的(不能记录用户的登录状态等),所以需要某种机制来保存用户的登录状态等信息,在下次访问web服务的时候,不用再 ...
- jsp页面格式时间yy-mm-dd
这个问题把我花了1小时都没弄出来 各种报错 还是最后同学告知才知道的. 导入 :<%@ taglib uri="http://java.sun.com/jsp/jstl/func ...
- Angular概念纵览
Conceptual Overview Template(模板): HTML with additional markup (就是增加了新的标记的HTML) Directive(指令): extend ...
- MongoDB学习笔记-01 简介、安装
MongoDB简介 MongoDB是一种强大.灵活.可拓展的存储方式.是一个面向文档(相当于"行"的概念)的数据库. 可拓展:通过添加服务器而增加存储量. Windows下安装 版 ...
- IOS和Android支持的音频编解码
1.IOS编码 参考文档地址:https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/Multimedi ...
- Cocoapods的安装,卸载和使用
[一]Cocoapods的安装 (1)Cocoapods的官方网站为: https://cocoapods.org/ .如果你的电脑已经安装了Ruby开发环境,那么在终端(Terminal)中使用以下 ...
- Hyper-V初涉:Hyper-V虚拟机常规操作
a. 连接到虚拟机与开机 在Hyper-V管理器中双击待启动的虚拟机或在待启动的虚拟机上右键选择"启动"即可完成连接虚拟机的操作. 若此时虚拟机正在运行则直接进入虚拟机界面,若虚拟 ...