Windows Phone 资源管理与换肤思考
新入手一台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 资源管理与换肤思考的更多相关文章
- Android插件化的思考——仿QQ一键换肤,思考比实现更重要!
Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...
- windows phone主题切换(换肤)
之前项目做了个主题切换的功能,最后客户没来得及出第二套界面给放弃了,默哀中... 为了不让它就这样流产了,就放博客共享吧. 首先说明下原理:这个切换是通过重写资源字典里指定的样式,在运行的过程中加载指 ...
- windows phone 换肤(2)
//这里有篇参考文章 http://www.cnblogs.com/tianhonghui/p/3373276.html#commentform 以下思路是来自徐老师,昨晚看了一个晚上球赛,睡了不到6 ...
- Qt编写可换肤的中文双拼汉字输入法
时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...
- C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能
今天经前辈提醒才知道winform窗体还有美化工具,呵呵,不得不说,孤陋寡闻了.下面总结一下irisskin2的使用步骤和遇到的问题及解决办法. 1.网址:http://www.pc6.com/sof ...
- Android实现apk插件方式换肤
换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控 ...
- VS中基于对话框的MFC利用换肤改变边框颜色及格式
第一版本: http://ishare.iask.sina.com.cn/f/13836420.html?from=like 2. http://www.cnblogs.com/phinecos/ar ...
- .NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能
IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤! 网上很多朋友说在VS2010中不能使用IrisSkin2.dll,我这里提供一个取巧的办法. Iri ...
- hybird之web动态换肤实现
前言 最近在重构个hybird(原生的壳包着Web页面)的UI框架,进行到了做换肤功能的阶段,所以这里是我思考的解决的方法. 预想 目前实现换肤的功能无非就两种做法. 1.写几个皮肤文件,然后切换使用 ...
随机推荐
- jsp页面的使用
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...
- df和du显示的磁盘空间使用情况不一致的原因及处理
在Linux下查看磁盘空间使用情况,最常使用的就是du和df了.然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊. 1. 如何记忆这两个命令 du-Disk Usage df-Disk Free ...
- iOS设计模式反思之单例模式的进化
什么是单例模式? 单例模式想一个大独裁者,他规定在他的国度里面,所有数据的访问和请求都得经过他,甚至你要调用相关的函数也得经过它.学术一点就是,单例模式,为某一类 需求和数据提供了统一的程序接口.主要 ...
- [ActionScript 3.0] AS3.0 获取像素点的灰度
/** * 获取像素点的灰度 * @color 像素点的颜色值 * @return uint */ function getGray(color:uint):uint { return getR(co ...
- Problem 2195 检查站点(普通树构造)(Vector)
Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 在山上一共有N个站点需要检查,检查员从山顶出发去各个站点进行检 ...
- startService()和bindService()区别
1. 生命周期:startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart().当用户在发出意图使之销毁时会经历onDestroy(),而 ...
- OC基础(19)
类扩展(Class Extension) Block基本概念 typedef和Block Block注意事项 *:first-child { margin-top: 0 !important; } b ...
- Codeforces Round #219 (Div. 1) C. Watching Fireworks is Fun
C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...
- Windows下cwRsync搭建步骤
文章(一) CwRsync是基于cygwin平台的rsync软件包,支持windows对windows.windows对Linux.Linux对windows高效文件同步.由于CwRsync已经集成了 ...
- 下拉列表autocomplete各种实现方式比较
方法一:用form 表单的datalist属性,此时会以首字母补充排序.实现效果参考:http://www.w3schools.com/html/tryit.asp?filename=tryhtml_ ...