讓你的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM