Silverlight 目前控件要改变外观一般都通过 Style="{StaticResource SomeStyle}" 来指定,而不能统一设置一个默认的 Style. 为了重用,一般把 Style 都放到 App.xaml 的 Resources 字典中去。而 Style 的定义往往非常冗长,这样 App.xaml 就会变得非常臃肿,修改维护都很麻烦。并且,还不能支持多个控件批量切换 Style 的,总之弊端非常多。

幸好 Nikhil Kothari 想了个办法解决了这个问题。在使用方式上,借鉴了 asp.net 的 Theme 机制。只要在 Silverlight 程序的根目录下定义一个 Themes 目录,并按要求往其中放入相关的皮肤文件即可。这里建议的方式是每一个控件一个单独的 xaml, 其中放了一个 UserControl. 之所以用 UserControl 的目的是为了能用 Expression Blend 进行可视化设计,非常直观。

主要实现思想:

1. 继承了一个自定义的 App 子类. 使用者需要将现有的 App.xaml 改成使用该类才行。
(同时这个 App 类还实现了根据 initParameters 在 xaml 中动态指定加载的 UserControl 和 Theme 的功能)
   其中设置一个 ThemeName 属性来定义 Theme 名称。

2. 在 App 启动时,根据这个属性名动态去加载相关 xaml 的 xml 文件,并解析之。这些皮肤的 xaml 文件在 VS 里是要把 Build Action 设置成 Content 的。这样可以生成到 xap 包里去,以便于加载。

3. 在读取多个 xaml 文件并解析的过程中对同样的 Style 根据优先级做了相应的覆盖合并。最终形成一个总的 xaml 文件内容。

4. 用 XamlReader 的 Load 方法加载最终的文档。将其中的资源都抽取出来,并塞到 App.Resources 字典里去。

5. 然后正常的控件视觉树开始创建。其中的视觉元素指定了 StaticResource 样式,这时它就能从 App 的资源字典里获取到皮肤样式。

注意:这里自始至终没有动态对控件指定 Style 的机制。因为 Silverlight 目前不支持。
这个解决方案的主要思想就是在视觉树加载之前,动态的修改了 App 中的资源,后续的样式应用机制仍然是 framework 默认的。

该方案的代码地址由 Nikhil Kothari 提供如下:[下载]

原文地址:http://www.nikhilk.net/Silverlight-Themes.aspx

Silverlight 下换肤的实现相关推荐

  1. 寻求合作开发.net下的换肤工具

    就我所知道,.net下换肤控件基本没有,决定发起一个开源项目, 最终的控件效果要超过或达到magicskin的效果 感兴趣的朋友请加入qq群1216839,

  2. 在WPF中创建可换肤的用户界面

    在WPF中创建可换肤的用户界面.                                                                       周银辉 译         ...

  3. Android App节日换肤

    Android App节日换肤 Android App节日换肤 1原理 2使用方式 1在XML中给需要换肤的控件添加tag属性 2在Activity中使用 3还有疑问吧 3示例图 比如支付宝,饿了么, ...

  4. Android换肤原理

    qq 网易云音乐的换肤功能很炫酷,这里总结下换肤原理. 换肤分为两种模式,静态换肤 动态换肤.静态换肤就是把不同皮肤的资源打包到apk中,使用时切换, 这种换肤的弊端就不再多说了(种类固定,apk大) ...

  5. .Net下WinForm换肤控件整理

    .Net下WinForm换肤控件整理                                                                                   ...

  6. 本节作业之显示不同问候语、显示密码、关闭二维码、循环精灵图背景、显示隐藏文本框内容、密码框格式提示错误、京东关闭广告、新浪下拉菜单、开关灯、换肤、表格隔行变色、表单取消全选、tab栏切换、发布删除留言

    本节作业之显示不同问候语.显示密码.关闭二维码.循环精灵图背景.显示隐藏文本框内容.密码框格式提示错误.京东关闭广告.新浪下拉菜单.开关灯.换肤.表格隔行变色.表单取消全选.tab栏切换.发布删除留言 ...

  7. 是男人就下100层【第五层】——换肤版2048游戏

    ---------------------------------------------------------------------------------------------------- ...

  8. Spring Boot一键换肤,so easy!

    SpringMVC 源码分析系列最后一篇,和大家聊一聊 Theme. Theme,就是主题,点一下就给网站更换一个主题,相信大家都用过类似功能,这个其实和前面所说的国际化功能很像,代码其实也很像,今天 ...

  9. 关于如何换肤、子类化的解决方案

    对于应用程序的换肤及子类化.下面是我尝试过一些方法,以在CAboutDlg中子类化其中的Button为例: 第一种:直接用现成的类 1.自己写一个类class CButtonXP : public C ...

最新文章

  1. 计算机操作系统“进程”与“线程”的通俗解析
  2. WIFI 基本理论-2017
  3. deLPHI书籍名称
  4. ABAP Development Tool前后台交互的原理
  5. matlab算出中心差分方法_方差分析、T检验、卡方分析如何区分?
  6. 单表置换密码java代码实现_C++实现单置换密码
  7. [******] java多线程连续打印abc
  8. android动画帧率_Android流畅度之帧率
  9. Selenium自动化测试-7.获取元素属性信息
  10. Deepin-文件目录介绍
  11. Chrome firefox ie等浏览器空格nbsp;宽度不一样
  12. 计算机科学与工程学院金巍,附件1湖北省思想政教育先进高校名单-附件1-.doc
  13. Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
  14. DNS错误不能上网怎么办?电脑dns错误修复方法?
  15. 高德地图开发踩坑记录
  16. C++:剑指Offer精讲1.整数除法
  17. Excel中时间相减的实例教程
  18. SQL Server代理(已禁用代理XP) 出现的原因以及解决方法【通俗易懂,简洁明了】
  19. 原型模式——java实现原型模式的几种写法
  20. 关于DB2数据库和SQL

热门文章

  1. american php frameworks
  2. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)
  3. 吴恩达机器学习--单变量线性回归【学习笔记】
  4. JAVA中的面向对象与内存解析_2
  5. Java基础-学习笔记(五)——面向过程和面向对象的区别
  6. JavaScript String支持的辅助format函数+【分页1】
  7. Git指令2 - 操作分支
  8. 主产品清单位于oracle,OPatch failed with error code 73(OracleHomeInventory gets null oracleHomeInfo)...
  9. 一个简单的if else优化
  10. Morse理论:拓扑不变性特征匹配原理