主题功能在移动开发中是最常见的功能之一,用的最多的是日间模式和夜间模式的切换,下面说说如何在WP上使用主题,不同主题的差别无非就是两种(颜色和图片),在WP上我们通常使用资源来设置颜色,系统提供了两种背景(白色/黑色)和主题色,当用户为系统设置不同的背景和主题色的时候,App也会根据主题色的不同而展示不同的效果,所以我们使用改变Brush的颜色或背景来控制主题的显示

  1、修改颜色画刷

    在修改原有的画刷(PhoneAccentBrush,PhoneForegroundBrush,PhoneBackgroundBrush等等)

    http://msdn.microsoft.com/zh-cn/library/ff769552 这里是系统默认的画刷

    例如:把主题色改为红色

    //把主题色改为红色(由于SolidColorBrush的Color是依赖属性,所以该修改可以通知到所有绑定该画刷的Brush)
((SolidColorBrush)Application.Current.Resources["PhoneAccentBrush"]).Color = Colors.Red; //注意:ResourceDictionary没有为setter提供实现,所以不能通过下面方式对Resources进行修改,会抛出NotImplementedException异常
//Application.Current.Resources["PhoneAccentBrush"] = new SolidColorBrush(Colors.Red);

  2、修改(添加)图片画刷

    例如:添加一个图片画刷资源

        //构造图片BitmapImage
var bitmapImage = new BitmapImage();
bitmapImage.SetSource(Application.GetResourceStream(
new Uri("Assets/ThemeResources/Day/black.jpg", UriKind.Relative)).Stream); if (Application.Current.Resources.Contains("MainBackgroundImageBrush"))
{
//如果已经定义过了MainBackgroundImageBrush,则设置其ImageSource
//建议在App.cs或者其资源引用文件中定义MainBackgroundImageBrush,这样在引用的地方可以看到智能提示,减少拼写错误
((ImageBrush) Application.Current.Resources["MainBackgroundImageBrush"]).ImageSource = bitmapImage;
}
else
{
//如果没有该资源,则添加(注意:这里需要在页面加载前设置,否则绑定不到该资源,一般放在App.xaml.cs的构造函数中)
Application.Current.Resources.Add("MainBackgroundImageBrush", new ImageBrush {ImageSource = bitmapImage});
}

  App.xaml

        <Application
x:Class="ThemeDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"> <!--Application Resources-->
<Application.Resources>
<local:LocalizedStrings xmlns:local="clr-namespace:ThemeDemo" x:Key="LocalizedStrings"/> <!--如果不是系统画刷,在这里进行定义,在引用的地方可以得到智能感知-->
<ImageBrush x:Name="MainBackGroundBrush"></ImageBrush> </Application.Resources> <Application.ApplicationLifetimeObjects>
<!--Required object that handles lifetime events for the application-->
<shell:PhoneApplicationService
Launching="Application_Launching" Closing="Application_Closing"
Activated="Application_Activated" Deactivated="Application_Deactivated"/>
</Application.ApplicationLifetimeObjects> </Application>

看完修改资源画刷的方法,下面我们封装一个ThemeManager对主题进行管理

  本来打算使用XML文件来保存主题颜色和图片信息(QQ貌似用XML保存的),但是XML对颜色和图片路径没有智能感知,所以在定义画刷颜色的时候不够直观,在纯文本的XML中写容易出错,所以下面使用xaml来定义资源文件,WP上的系统主题资源也是使用xaml文件定义的,VS对xaml文件有很好的支持,下面定义两个主题文件(DayResource.xaml, NightResource.xml)

DayResources.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!--背景色-->
<Color x:Key="PhoneBackgroundBrush">White</Color>
<!--前景色-->
<Color x:Key="PhoneForegroundBrush">#FF000000</Color>
<!--次标题颜色-->
<Color x:Key="PhoneSubtleBrush">#DD000000</Color> <!--主背景图-->
<BitmapImage x:Key="MainBackGroundBrush" UriSource="/Assets/ThemeResources/Day/Blue.jpg"/>
</ResourceDictionary>

NightResources.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!--背景色-->
<Color x:Key="PhoneBackgroundBrush">Black</Color>
<!--前景色-->
<Color x:Key="PhoneForegroundBrush">#FFDDDDDD</Color>
<!--次标题颜色-->
<Color x:Key="PhoneSubtleBrush">#DDDDDDDD</Color> <!--主背景图-->
<BitmapImage x:Key="MainBackGroundBrush" UriSource="/Assets/ThemeResources/Night/Black.jpg"/>
</ResourceDictionary>

接下来我们在ThemeManager加载主题资源

/// <summary>
/// 主题管理器
/// </summary>
public class ThemeManager
{
/// <summary>
/// 加载主题资源
/// </summary>
/// <param name="path">例如:/Assets/ThemeResources/DayResource.xaml</param>
public static void Load(string path)
{
var resourceDictionary = new ResourceDictionary(); //从程序集读取资源(这里的Uri格式:/解决方案;component/资源文件路径)
Application.LoadComponent(resourceDictionary,
new Uri(string.Format("/ThemeDemo;component{0}", path), UriKind.Relative)); //应用样式(只有颜色和Color和图片BitmapImage)
foreach (DictionaryEntry kv in resourceDictionary)
{
if (kv.Value is Color)
{
((SolidColorBrush)Application.Current.Resources[kv.Key]).Color = (Color)kv.Value;
}
else if (kv.Value is BitmapImage)
{
if (Application.Current.Resources.Contains(kv.Key))
{
((ImageBrush)Application.Current.Resources[kv.Key]).ImageSource = ((BitmapImage)kv.Value);
}
else
{
Application.Current.Resources.Add(kv.Key, new ImageBrush {ImageSource = (BitmapImage) kv.Value});
}
}
}
}
}

Toolkit都定义好了,下面是使用,我们在App.xaml.cs的构造函数中加载默认主题,当我们需要修改主题的时候,直接调用ThemeManager的Load方法就可以直接切换主题了

下面是效果图(背景图拿QQ的)

如果需要添加其他主题,直接编写Resource.xaml即可,在需要应用的时候传主题路径

附上Demo:

http://files.cnblogs.com/bomo/ThemeDemo.zip

声明:转载请注明出处http://www.cnblogs.com/bomo/

【WP8】换肤功能的实现的更多相关文章

  1. 一种简单的实现:Android一键换肤功能

    现在的APP开发,通常会提供APP的换肤功能,网上流传的换肤代码和实现手段过于复杂,我把原作者的代码重新整理抽取出来,转换成Eclipse项目,重新整理成正确.可直接运行的项目. 代码运行结果如图. ...

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

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

  3. 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)

    一.背景 在越来越重视用户体验的今天,换肤功能也慢慢被重视起来.一个web系统用户可以选择一个自己喜欢的系统主题,在用户眼里还是会多少加点分的.我们很开心的是easyui v1.3.4有自带defau ...

  4. 【转】Javascript+css 实现网页换肤功能

    来源:http://www.php100.com/html/webkaifa/DIV_CSS/2008/1014/2326.html Html代码部分: 1.要有一个带id的样式表链接,我们要通过操作 ...

  5. Android 换肤功能的实现(Apk插件方式)

    一.概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现. 目前换肤的方法大概有三种方案: (1)把皮肤资 ...

  6. 用js来实现页面的换肤功能(带cookie记忆)

    用js来实现页面的换肤功能 js实现换肤功能的实现主要是通过利用js控制CSS来实现的.大致的实现原理是这样的, 1.先定义一个页面基本样式style.css来确定div的宽高等属性,使得整个页面的D ...

  7. JS实现网页换肤功能效果

    网页换肤的基本原理 使用 JS 切换对应的 CSS 样式表.例如hao123首页的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过 ...

  8. cookie换肤功能

    <div class="selectSkin"> <input id="red" class="themeBtn" typ ...

  9. 换肤功能的实现以及监听storage实现多个标签页一起换肤

    1:需求:项目的侧边栏实现换肤功能,核心代码: updateSkin (val) { const existSkinLink = document.head.querySelector('link[i ...

  10. Android一键换肤功能:一种简单的实现

     Android一键换肤功能:一种简单的实现 现在的APP开发,通常会提供APP的换肤功能,网上流传的换肤代码和实现手段过于复杂,这里有一个开源实现,我找了一大堆,发现这个项目相对较为简洁:htt ...

随机推荐

  1. C#学习笔记(19)——使用IComparer(百度文库)

    说明(2017-7-24 19:15:15): 1. 百度文库里的一篇文章,觉得讲的比较好.原文地址:https://wenku.baidu.com/view/b53cd250ad02de80d4d8 ...

  2. 2. 感知机(Perceptron)基本形式和对偶形式实现

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  3. MVC LinqToSql Json DbComparisonExpression 需要具有可比较类型的参数。

    需求是:使用post方式传入Controller一个id,然后返回给前台一个Json.突然就报了这个错误,折腾了俩小时, 发现是linq to sql 的语法错了

  4. Android 好用和常用的控件

    好用的库  https://github.com/daimajia/AndroidSwipeLayout  拖动删除      https://github.com/bingoogolapple/BG ...

  5. [转]handsontable常规配置的中文API

    原文地址:http://blog.csdn.net/mafan121/article/details/46050049 常规配置: 1.固定行列位置 fixedRowsTop:行数 //固定顶部多少行 ...

  6. [转]httpclient编码

    这几天都在纠结Java Web开发中的中文编码问题.其实,很多Java Web开发者都被中文编码“折磨”过,网络上有大量的讨论.以前我也读过这方面的博文,读完后感觉似乎懂了,好像知道了编码问题的原因和 ...

  7. git pull出现There is no tracking information for the current branch

    使用git pull 或者 git push 的时候报错 gitThere is no tracking information for the current branch. Please spec ...

  8. C语言 · 扶老奶奶过街

    算法提高 扶老奶奶过街   时间限制:1.0s   内存限制:256.0MB      一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我 ...

  9. Ehcache 缓存监控配置

    监控 ehcache缓存: 1,下载: http://terracotta.org/downloads/open-source/destination?name=ehcache-monitor-kit ...

  10. Spark部署

    Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出现错误看日志信息,完全看不懂那个错误信息,所以才打算翻译Standalone的部署的文章.第 ...