博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让你的WPF程序在Win7下呈现Win8风格主题
阅读量:5817 次
发布时间:2019-06-18

本文共 2396 字,大约阅读时间需要 7 分钟。

今天在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文件夹下加上对应的样式资源即可。

    

具体可以参看这篇文章:

 

转载地址:http://zuwdx.baihongyu.com/

你可能感兴趣的文章
mysql乱码处理一则
查看>>
cf #345 div2 C(Vasya and String。双端队列)
查看>>
Python LDAP中的时间戳转换为Linux下时间
查看>>
微信小程序蓝牙连接小票打印机
查看>>
决策树算法
查看>>
环境错误2
查看>>
spring下的多线程
查看>>
C++_了解虚函数的概念
查看>>
全新jmeter视频已经上架
查看>>
Windows 8下如何删除无线配置文件
查看>>
解决Windows 7中文件关联和打开方式
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
Hyper-V 2016 系列教程24 配置 iSCSI存储服务器
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
C#窗体控件更新(六)
查看>>
对java语言学习的个人看法
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
大容量导入和导出数据 -- 格式化文件生成
查看>>