新入手一台Windows 8的笔记本,安装了VS2013后,终于又可以开发WP了。公司暂时不愿意开发WP,那么咱就自行研究吧!

在没有WP开发环境的时候,曾经在WPF尝试了一下换肤功能的实现。最简单的是在后台修改需要更换样式的控件的Style,然而这样做工作量很大而且可拓展性也很差。总不可能添加一种主题皮肤,就在每个页面写一次Style的加载吧,工作量太大又容易出错。

于是在MSDN上仔细阅读了相关文档,发现了DynamicResource拓展关键字。MSDN描述为“为任何 XAML 属性特性提供值,该值将推迟为对已定义的资源的引用。 该资源的查找行为与运行时查找类似。”什么意思呢,就是运行时才加载改资源,并且键值对应的资源修改时会同时更新UI控件的显示。这不是正是我们要找的么!

于是用WPF做了的Demo,Demo里面有两套模板,两套模板都定义了一套相同键值的资源样式(Style)。而页面使用DynamicResource绑定对应资源。切换两套模板,实现皮肤更换。

blackStyle.xaml模板

<Style x:Key="bgGrid" TargetType="Grid">
<Setter Property="Background">
<Setter.Value>
<ImageBrush ImageSource="/Img/bgBlack.jpg" Stretch="Fill"/>
</Setter.Value>
</Setter>
</Style>

WhiteStyle.xaml模板

<Style x:Key="bgGrid" TargetType="Grid">
<Setter Property="Background">
<Setter.Value>
<ImageBrush ImageSource="/Img/bgLight.jpg" Stretch="Fill"/>
</Setter.Value>
</Setter>
</Style>

切换应用加载的资源实现换肤

if (Application.Current.Resources.MergedDictionaries[].Source.OriginalString.Equals("/Common/BlackStyle.xaml"))
{
Application.Current.Resources.MergedDictionaries[].Clear();
Application.Current.Resources.MergedDictionaries[].Source = new Uri("/Common/WhiteStyle.xaml", UriKind.Relative);
}
else
{
Application.Current.Resources.MergedDictionaries[].Clear();
Application.Current.Resources.MergedDictionaries[].Source = new Uri("/Common/BlackStyle.xaml", UriKind.Relative);
}

如此,确实能实时更换皮肤。然而当我配置好Windows Phone的开发环境时,却发现这样的方式在WPF行得通,而Windows Phone 上面却行不通。且不说WP上没有实现DynamicResource关键字,在执行Application.Current.Resources.MergedDictionaries[1].Source = new Uri("/Common/BlackStyle.xaml", UriKind.Relative);这一句的时候更是提示了调用了Com组件的错误。好吧,WP的内核是和WPF不同,所以不能这样实现。但是动态资源DynamicResource确实是实现Xaml换肤的最好方式。

那么还有什么方法可以实现动态更换皮肤,并且可拓展性和可维护性又好呢?经过一番思考之后,觉得附加属性能够实现这样的功能。附加一个StyleName属性,并且属性根据应用的设置查询出相应的Style加载到控件上。如何实现应用主题切换通知页面重新加载样式这个关键点,还在思索当中,后续有结果会再发表博文。同时希望有好想法的能留个思路。

设想:

<Grid cm:StyleAttach.StyleName="bgGrid" cm:StyleAttach.Theme="{Binding Theme}">
</Grid>

通过绑定主题和资源名称来获取资源,同时通过Theme附加属性的修改,保证主题更改时实时更新皮肤。

Windows Phone 资源管理与换肤思考的更多相关文章

  1. Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

    Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...

  2. windows phone主题切换(换肤)

    之前项目做了个主题切换的功能,最后客户没来得及出第二套界面给放弃了,默哀中... 为了不让它就这样流产了,就放博客共享吧. 首先说明下原理:这个切换是通过重写资源字典里指定的样式,在运行的过程中加载指 ...

  3. windows phone 换肤(2)

    //这里有篇参考文章 http://www.cnblogs.com/tianhonghui/p/3373276.html#commentform 以下思路是来自徐老师,昨晚看了一个晚上球赛,睡了不到6 ...

  4. Qt编写可换肤的中文双拼汉字输入法

    时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...

  5. C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能

    今天经前辈提醒才知道winform窗体还有美化工具,呵呵,不得不说,孤陋寡闻了.下面总结一下irisskin2的使用步骤和遇到的问题及解决办法. 1.网址:http://www.pc6.com/sof ...

  6. Android实现apk插件方式换肤

    换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控 ...

  7. VS中基于对话框的MFC利用换肤改变边框颜色及格式

    第一版本: http://ishare.iask.sina.com.cn/f/13836420.html?from=like 2. http://www.cnblogs.com/phinecos/ar ...

  8. .NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能

    IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤! 网上很多朋友说在VS2010中不能使用IrisSkin2.dll,我这里提供一个取巧的办法. Iri ...

  9. hybird之web动态换肤实现

    前言 最近在重构个hybird(原生的壳包着Web页面)的UI框架,进行到了做换肤功能的阶段,所以这里是我思考的解决的方法. 预想 目前实现换肤的功能无非就两种做法. 1.写几个皮肤文件,然后切换使用 ...

随机推荐

  1. 一机运行多个resin的配置

    对于java应用服务器,常用的一般为tomcat.jboss.resin. 一. 概述 经常会有这种情况: 1.一台服务器上,跑多个java应用 2.网站负载高,需要采用负载均衡(轮询)的方式来解决 ...

  2. sql执行返回值存储

    List<Map> list = SqlRunner.queryMapList(sql); if(list != null && !list.isEmpty()){ Has ...

  3. vim 配合管道过滤多行记录

    vim打开一个日志 有很多冗余信息,你只想看到一部分的内容,怎么办? 在normal模式输入 :%!grep xxx 这样,所有含有xxx的行才会被保留下来,其它行都不见了.. 或者,你想干掉所有包含 ...

  4. 阻止Application_End事件的解决方案

    在做项目时,遇到同步ERP数据的问题,客户要求是:程序中,设置一个开始时间,再设置一个时间间隔,让程序每隔一段时间导出销售记录,这个开始时间和时间间隔可以手动修改设定.     这问题纠缠了我好几天, ...

  5. poj 1328 Radar Installation(nyoj 287 Radar):贪心

    点击打开链接 Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43490   Accep ...

  6. nyoj 79 导弹拦截

    点击打开链接 拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发 ...

  7. oracle 数据恢复,只有oradata文件夹里的文件,没有备份文件的数据库恢复,重装系统后,oracle 10g数据库恢复

    格式化重装系统后,才想起来oracle 10g 数据库没有做备份,开始以为很麻烦,没想到数据库恢复的还挺顺利的 恢复方法: 1,把原来的数据库文件备份,(D:\oracle\product\10.2. ...

  8. HashCode equals

    HashCode: hashcode就是一个签名.当两个对象的hashcode一样时,两个对象就有可能一样.如果不一样的话两个对象就肯定不一样.一般用hashcode来进行比较两个东西是不是一样的,可 ...

  9. V$SGA_RESIZE_OPS.STATUS = ERROR, and MMAN / auto-tuning stops.

    Oracle Server - Standard Edition - Version: 10.2.0.3This problem can occur on any platform. SYMPTOMS ...

  10. QWizard中运行时默认按钮显示英文问题

    QWizard中运行时默认按钮在编译前设计界面的时候是显示中文的,运行的时候就变成英文了.. 后来是发现国际化的时候有问题,解决办法如下: 在main.cpp里加: QTranslator* tran ...