Generic.xaml有什么特别之处?

我一直在试图找出如何组织我的ResourceDictionary文件重用和与我的团队的其他成员共享。

我一直在遇到“Generic.xaml”,但是如果我在Generic.xaml的MSDN上看,或者只是做一个谷歌search,我似乎只是得到博客文章和论坛问题碰巧提到它 – 我似乎无法打击任何真正的权威和明确。

Generic.xaml和MyRandomlyNamedResourceDictionary.xaml有什么区别? 看起来像这样,我必须引用Source属性中存储在库中的ResourceDictionaries。 例如,:

<Application.Resources> <ResourceDictionary Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" </Application.Resources> 

那么Generic.xaml究竟提供了什么好处呢? 如果我不试图给我的应用程序多个“外观”(即,如果我只有一个主题),它有什么目的吗?

WPF中的每一个控件都有一个默认的Style,它提供了控件的默认ControlTemplate 。 WPF在与控件相同的程序集中的“主题”文件夹中的特殊资源字典中查找默认样式。 默认样式的关键是由Control.DefaultStyleKey依赖项属性提供的,其默认值在Control的每个子类中被覆盖。

资源字典的名称取决于当前的Windows主题,例如在使用Aero主题的Vista上,该字典被称为Aero.NormalColor.xaml,在XP上使用默认的主题是Luna.NormalColor.xaml。 如果在主题字典中找不到样式,它将在Generic.xaml中查找,即其外观不依赖于主题的控件。

这仅适用于您定义的任何自定义控件,即直接或间接从Control派生的类。 您可以通过派生标准控件的默认样式并在静态构造函数中调用DefaultStyleKeyProperty.OverrideMetadata ,但是您必须提供包括ControlTemplate在内的完整样式。

请注意,您可以通过使用ThemeInfo属性来告诉WPF在外部程序集中查找默认样式。 外部程序集必须命名为< YourAssembly >< ThemeName > .dll例如PresententationFramework.Aero.dll。

对于一个generic.xaml文件(不区分大小写)是特殊的,必须满足两个条件:

  • 它必须位于项目的主题子根文件夹中
  • 程序集必须用ThemeInfoAttribute标记(通常在AssemblyInfo.cs

然后,它将作为您希望应用到控件的任何默认样式的默认查找位置。 还要注意,对于默认的样式,它必须声明它的TargetType和x:Key作为要被样式化的控件的types。

如果您希望将整个主题和主题切换添加到您的应用程序中,则可以使用一些编码来完成,但这种技术仅仅定义了默认资源字典。