今天在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
注意:我這裏取的是.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