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来达到切换数据源,查询不同的数据库就可以 ...
随机推荐
- axure设置变量值
以登录框为例设置axure变量值 1.打开axure,打开新页面命名为login,拖入一个矩形背景,命名:登录背景图 2.拖入标签控件和输入框控件分别命名为用户名:.userName.密码:.pass ...
- WIN2003使用IP安全策略只允许指定IP远程桌面连接
一,新建IP安全策略 WIN+R打开运行对话框,输入gpedit.msc进入组策略编辑器. 依次打开“本地计算机”策略--计算机配置--Windows设置--安全设置--IP安全策略,在 本地计算机上 ...
- ATL 获取flash信息
// This goes past the ATL includes #import "C:/WINDOWS/system32/Macromed/Flash/Flash9e.ocx" ...
- Linux下chkconfig命令详解
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- hdoj 2034 人见人爱A-B
Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...
- [转]了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密_Mr_Indigo的空间
了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密 关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修 ...
- SQL Split
最初是根据数据ID批量删除数据,因为不知道到底是要删除多少条,而T-sql里也没有像C#中params这样方便的东西,所以想到字符串分割,但是发现T-sql中也没有提供字符串分割的函数,所以自己搜索了 ...
- 移动App崩溃的测试用例设计
我们的日常生活中对移动设备越来越多的使用意味着移动App测试这个主题已成为需要考虑的一个无法避免的问题.根据最近的调查研究,用户难以容忍有bug的移动App. 移动App Bug的影响是用户体验差.A ...
- SpringMVC常用注解實例詳解2:@ModelAttribute
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- permutation II (boss出来了)
题目链接:https://leetcode.com/submissions/detail/55876321/ 自己的做法,30个测试用例通过了29例,终究还是有一个系列类型的是无法通过的,因为自己妄想 ...