今天在Win8下使用了一个我之前写的一个WPF程序的时候,发现现在也支持Win8效果了(记得以前的.net 4.0的版本是不支持的)。由于WPF的控件是自绘的,并不受系统主题所控制,也就是说.net 4.5中是附带了Win8主题样式文件的,按理说这个风格在Win7下也可以使用的。研究了一下发现,默认主题是存放在如下几个DLL文件中的,

程序启动的时候,默认会根据系统的版本加载相应的主题。例如Win8就加载AeroLite.dll,Win7就加载Aero.dll。用ILSpy可以看到其具体的路径

我把.Net 4.5下的所支持的几个主题路径都提取出来了,分别如下:

  • Win8(AeroLite):  /PresentationFramework.AeroLite, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/aerolite.normalcolor.xaml
  • Win7 (Aero)  /PresentationFramework.Aero, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/aero.normalcolor.xaml
  • WinXP 亮蓝(Royale)  /PresentationFramework.Royale, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/royale.normalcolor.xaml
  • WinXP蓝色(Luna)  /PresentationFramework.Luna, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/luna.normalcolor.xaml
  • WinXP银色(Luna)  /PresentationFramework.Luna, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/luna.metallic.xaml
  • WinXP橄榄色(Luna)  /PresentationFramework.Luna, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes /luna.homestead.xaml
  • Win98(Classic)  /PresentationFramework. Classic, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes /classic.xaml

注意:我这里取的是.Net 4.5的样式文件路径,其它的.Net版本的路径可能稍有不同,具体的自己用ILSpy看一下基本上就出来了。

有了这些样式路径后,只要在启动的时候应用一下全局样式,即可在Win7种呈现Win8的AeroLite效果:

    protected override void OnStartup(StartupEventArgs e)
{
var uri = new Uri("/PresentationFramework.AeroLite, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/AeroLite.NormalColor.xaml", UriKind.Relative);
App.Current.Resources.Source = uri;
base.OnStartup(e);
}

效果如下,看着还有一点小清新的感觉。

我们还可以以同样的方式实现复古的Win XP效果:

或者更复古的Win 98效果:

基于同样的原理,我们也可以只设置某个控件样式:

代码如下:

    private void button_Click(object sender, RoutedEventArgs e)
{
var uri = new Uri("/PresentationFramework.AeroLite, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35;component/themes/AeroLite.NormalColor.xaml", UriKind.Relative);
var resourceDictionary = Application.LoadComponent(uri) as ResourceDictionary;
(sender as FrameworkElement).Resources.MergedDictionaries.Add(resourceDictionary);
}

最后需要介绍的一个知识点是:如果我们有自定义控件的时候,如何像系统控件那样根据不同的系统呈现不同的样式呢?方法是:在Theme文件夹下加上对应的样式资源即可。

具体可以参看这篇文章:Add Windows 8 Aero Theme Support to your WPF Custom Control

最新文章

  1. Oracle 应用于.NET平台
  2. Socket模型详解(转)
  3. this super 解释
  4. 线性表 - 从零开始实现by C++
  5. velocity 随笔
  6. iOS多线程编程Part 1/3 - NSThread & Run Loop
  7. Collection_Other
  8. *[topcoder]JumpFurther
  9. 启用aspnet
  10. [转] rtp h264注意点(FU-A分包方式说明)
  11. ubuntu下使用自带的openJDK查看java源码
  12. Net 高效开发
  13. Web应用和RESTful架构
  14. 【 DCOS 】织云 CMDB 管理引擎技术详解
  15. iOS_正則表達式
  16. CMDB服务器管理系统【s5day89】:部分数据表结构-资产入库思路
  17. SQL0803问题 键值重复
  18. c3算法详解
  19. listview重新计算高度
  20. BZOJ.3257.树的难题(树形DP)

热门文章

  1. 微信小程序实现图片上传,预览,删除
  2. 部署HBase系统(分布式部署)
  3. [New learn] 设计模式
  4. python笔记_查看函数调用栈的一个小技巧
  5. IE中部分版本的浏览器对Select标签设置innerHTML无效的问题
  6. jequry_rotate.js用来写旋转类的东西的插件(如:抽奖转盘)
  7. Android各层推荐开发书籍及参考资料!!!
  8. BZOJ 1010 玩具装箱toy(斜率优化DP)
  9. 今天开始学模式识别与机器学习(PRML),章节5.1,Neural Networks神经网络-前向网络。
  10. OpenStack 安装数据库和rabbitmq消息队列 (三)