如何使WPF程序与当前选择的Windows主题相匹配

9
我希望我的WPF应用程序可以从当前选定的系统主题中绘制。为了举例说明,这是一个Windows Forms版本的我所希望实现的内容。

A basic winforms window with toolstrip and menustrip

这个Windows窗体有一个基本的菜单栏和一个工具栏,具有两种特定的主题。如果用户选择更改主题,它的外观将会改变:

same window, in green

此外,当在Windows 7上运行时,它将切换到Aero主题。我希望在WPF中也能做到同样的效果。但是我不确定如何使WPF窗口样式与当前的Windows主题相同。这个窗口(xaml)还有一个menustrip和toolstrip控件,但并没有完全遵循所选的Windows主题。

WPF needs something in order to theme correctly

菜单和工具栏控件不保留XP Luna主题中的渐变效果。请注意,与其他WPF主题帖子不同,我并未尝试覆盖用户选择的Windows主题。这个问题似乎接近我的问题,但我想将所有控件的主题与选定的系统主题匹配,除非被覆盖。这需要逐个控件进行吗?是否可以为整个项目配置?此MSDN文章仅涵盖自定义控件。
我会很感激具体的示例,以使WPF菜单和WPF工具栏控件与当前系统主题相匹配。
编辑: 还可以知道将菜单设置为什么颜色,以便在菜单项旁边出现系统主题条纹:(在“退出”左侧)

screenshot of open menu

(在“Exit”的左侧)
2个回答

6

一种方法是使用系统颜色(类似于这些)。它们将根据主题相应地更改。我不确定是否有更简单的方法,但这是一个好方法=)。下面列出了每个主题的颜色列表。


这是一个很好的链接!不幸的是,我还有点困惑:在系统使用Luna主题(第一和第二个截图)时,我应该将菜单控件的背景属性设置为哪种颜色才能使其呈现出主题渐变。 - ford
您也可以使用此程序通过从Windows控制面板更改颜色来测试哪种颜色是哪种。这是该程序的链接:http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-38-64-SystemColors+Reference/3482.SystemColorsSwatch.zip - Carlo
以下是如何测试它的方法:http://blogs.msdn.com/b/wpf/archive/2010/11/30/systemcolors-reference.aspx#PT3 - Carlo
1
是的。当用户切换主题时,这些系统颜色会改变。你试过这个吗?http://blogs.msdn.com/b/wpf/archive/2010/11/30/systemcolors-reference.aspx#PT3 - Carlo
太好了!这种方法可以改变一些屏幕颜色以匹配当前主题(必须将画笔注册为动态资源,并使用正确的System.Color)。 - ford
显示剩余2条评论

2
问题在于WPF控件与Windows Forms控件或任何其他GDI元素内部非常不同。WPF控件的外观是通过.Net中的不同类来定义的。同样的主题不能神奇地应用于它们。
因此,我会说-是的,您应该使用此问题答案中的资源文件按控件实现主题。我假设我们很幸运,微软已经为我们提供了这些文件。另一件事是,这些xaml样式的存在证明了WPF框架有多么可配置。
主题xaml文件位于{Program Files}\Microsoft Expression\Blend 4\SystemThemes\Wpf\
您最初引用的问题在其答案中有一个链接主题的示例:Windows 7 theme for WPF? 要更改主题,您可以动态添加/删除Application.Current.Resources.MergedDictionaries中的条目。
您将需要自己检测当前的主题。

我同意你链接的SO问题,但我提出这个问题的主要原因是因为我在那里发布的解决方案并不能完全满足我的需求。那些xaml文件(例如Luna.xaml)需要从某个地方加载吗?在菜单栏或工具箱栏上运行的示例将非常好。 - ford
1
Ford,我稍微更新了一个答案。我知道你在写问题之前就已经看到了这两个问题,但据我所知,没有比解决你的问题更容易和自动化的方法了。 - Maxim V. Pavlov
Maxim,感谢您的帮助回复。特别值得注意的是我需要自己检测主题的部分。其他地方没有明确提到过。 - ford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接