原文: 讓你的WPF程式在Win7下呈現Win8風格主題 今天在Win8下使用了一個我之前寫的一個WPF程式的時候,發現現在也支援Win8效果了(記得以前的.net 4.0的版本是不支援的)。由于WPF的控件是自繪的,并不受系統主題所控制,也就是說.net 4.5中是附帶了Win8主題樣式檔案的,按理說這個風格在Win7下也可以使用的。研究了一下發現,預設主題是存放在如下幾個DLL檔案中的,

- 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