让你的WPF程序在Win7下呈现Win8风格主题
2015-01-01 20:42
218 查看
今天在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效果:
效果如下,看着还有一点小清新的感觉。
我们还可以以同样的方式实现复古的Win XP效果:
或者更复古的Win 98效果:
基于同样的原理,我们也可以只设置某个控件样式:
代码如下:
最后需要介绍的一个知识点是:如果我们有自定义控件的时候,如何像系统控件那样根据不同的系统呈现不同的样式呢?方法是:在Theme文件夹下加上对应的样式资源即可。
具体可以参看这篇文章:Add Windows 8 Aero Theme Support to your WPF Custom Control
程序启动的时候,默认会根据系统的版本加载相应的主题。例如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
相关文章推荐
- WPF程序中使用Vista/Win7风格的OpenFolderDialog
- android风格和主题程序编写–style & theme
- 在WPF程序中将控件所呈现的内容保存成图像
- win7、win8设置管理员运行程序详细图解(2种方法)
- 使WPF程序应用预置的控件风格, 如Aero, Luna, Royale, Classic等
- [转]使WPF程序应用预置的控件风格, 如Aero, Luna, Royale, Classic等
- 图解使用Win8Api进行Metro风格的程序开发十二----上下文菜单
- 图解使用Win8Api进行Metro风格的程序开发十----音乐播放
- 图解使用Win8Api进行Metro风格的程序开发二
- VC6.0 VC2005 下使程序直接具有XP主题界面风格
- 自己动手打造WinXP风格的Win7显示桌面程序
- XP高仿win7宽栏风格主题
- 安装win8后,恢复win7风格的开机菜单
- 图解使用Win8Api进行Metro风格的程序开发七----BackgroundDownloader和BackgroundUploader
- VC2008中为你的程序添加XP主题风格
- WPF程序禁止win7窗口自动最大化
- 图解使用Win8Api进行Metro风格的程序开发二----使用文件选择器访问和保存文件
- WPF程序同样的代码在WIN7和XP下结果不一样?
- WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法
- 图解使用Win8Api进行Metro风格的程序开发九----解压缩