让你的WPF程序在Win7下呈现Win8风格主题

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

今天在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

 

目录
相关文章
|
11月前
|
C#
WPF防止程序多次运行
WPF防止程序多次运行
135 0
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
|
Java C# 程序员
WPF程序中的弱事件模式
原文:WPF程序中的弱事件模式 在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不是按照我们所期望的方式工作。 例如,我想实现一个在窗口的标题栏中实时显示当前的时间,一个比较常规的做法如下:     var...
1086 0
|
C#
WPF程序 双击exe自动申请“以管理员方式运行”权限
原文:WPF程序 双击exe自动申请“以管理员方式运行”权限 实现方式: 在 xxx.exe 目录下包含其对应的清单文件(xxx.exe.manifest); 用记事本打开 manifest 文件,将文件中的项:更改为:
1318 0
|
C#
【msdn wpf forum翻译】如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点?
原文:【msdn wpf forum翻译】如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点?原文链接:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cf884a91-c135-447d-b16b-214d2d9e9972 有时有些特殊的程序需要这样处理。
953 0
|
C#
WPF 启动唯一程序(项目,exe,实例)
原文:WPF 启动唯一程序(项目,exe,实例) 描述:用户多次快速开启WPF程序的时候  只运行起来 一个 程序(exe) 其他多开的 进程 自动关闭掉 App.xaml.cs文件   1 protected override void OnStartup(Startu...
1242 0
|
C# Windows
WPF:如何为程序添加splashScreen?
原文:WPF:如何为程序添加splashScreen? 大家是否还记得在Windows Forms程序中如何实现splashScreen吗?我们一般都会使用Microsoft.VisualBasic.dll中提供的那个WindowsFormsApplicationBase类型,它有一个所谓的splashscreen属性,可以指定为一个窗体的。
860 0
|
C# API
在WPF程序中将控件所呈现的内容保存成图像
原文:在WPF程序中将控件所呈现的内容保存成图像 有的时候,我们需要将控件所呈现的内容保存成图像保存下来,例如:InkCanvas的手写墨迹,WebBrowser中的网页等。可能有人会说,这个不就是截图嘛,找到控件的坐标和大小,调用截图API不就可以了嘛。
1085 0
|
18天前
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
|
4月前
|
C#
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
65 1