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

时间:2012-01-14 00:56:23

标签: c# .net wpf

我想从当前选定的系统主题中绘制我的WPF应用程序。

为了说明,这是我希望完成的Windows窗体版本。

A basic winforms window with toolstrip and menustrip

此Windows窗体窗口有一个基本的menustrip和一个特定主题的工具条。如果用户选择更改主题,其外观将会改变:

same window, in green

此外,它将在Windows 7中运行时切换到areo主题。我想在WPF中执行相同操作。但我不确定如何在当前的Windows主题之后设置WPF窗口样式。此窗口(xaml)也有menustrip和toolstrip控件,但不完全遵循选定的Windows主题。

WPF needs something in order to theme correctly

菜单和工具栏控件不保留XP Luna主题中的渐变。请注意,与other WPF theming posts不同,我不会尝试覆盖User Selected Windows主题。 This question似乎与我很接近,但我想主题所有控件以匹配所选系统主题,除非被覆盖。这需要在每个控制的基础上完成吗?可以为整个项目配置吗?此MSDN article仅涵盖自定义控件。

我将非常感谢有关如何使WPF菜单和WPF工具栏控件与当前系统主题相匹配的具体示例。

编辑: 知道将菜单设置为什么颜色以使系统主题条纹出现在菜单项旁边也是很好的:(在“退出”的左侧)

screenshot of open menu

(“退出”的左侧)

2 个答案:

答案 0 :(得分:5)

一种方法是使用系统颜色like these。他们将根据主题进行相应的更改。我不确定是否有更简单的方法,但这是一个很好的方法=)。下面有一个列表,显示每个主题的颜色。

答案 1 :(得分:2)

问题是WPF控件在内部与Windows窗体或其他任何GDI元素非常不同。 WPF控件的外观是在.Net中的不同类的帮助下定义的。同样的主题可以神奇地应用于他们。

因此我想说 - 是的,您应该使用this question's答案中的资源文件在每个控件的基础上实现主题化。

我认为我们很幸运MS为我们提供了这些。另一件事是,这些xaml样式的存在证明了WPF框架的可配置性。

主题xaml文件位于{Program Files} \ Microsoft Expression \ Blend 4 \ SystemThemes \ Wpf \

您最初引用的问题有一个示例,说明如何在其中链接它们的答案:Windows 7 theme for WPF?

要交换主题,您可以动态添加/删除Application.Current.Resources.MergedDictionaries

中的条目

您必须自己检测当前主题。