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

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

    

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

    

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

  • 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看一下基本上就出来了。.net

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

    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);
    }

效果以下,看着还有一点小清新的感受。code

    

咱们还能够以一样的方式实现复古的Win XP效果:component

    

或者更复古的Win 98效果:orm

    

基于一样的原理,咱们也能够只设置某个控件样式:blog

    

代码以下:资源

    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

相关文章
相关标签/搜索