Generic.xaml有什么特别之处?

时间:2009-08-04 17:30:54

标签: wpf xaml themes

我一直在努力弄清楚如何组织我的ResourceDictionary文件,以便重复使用并与我团队的其他成员共享。

我一直遇到“Generic.xaml”,但如果我在MSDN上查看Generic.xaml或者只是进行谷歌搜索,我似乎只会提到博客文章和论坛问题 - 我可以'似乎对任何真正权威和清晰的东西都有所帮助。

Generic.xaml和MyRandomlyNamedResourceDictionary.xaml有什么区别?看起来无论哪种方式,我都必须使用Source属性引用存储在库中的ResourceDictionaries。 。E.g,:

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

那么Generic.xaml有什么优势呢?如果我不试图给我的应用程序多个“外观”(即,如果我只有一个主题),它是否有任何目的?

2 个答案:

答案 0 :(得分:140)

WPF中的每个控件都有一个默认样式,除其他外,它提供了控件的默认ControlTemplate。 WPF在与控件相同的程序集中的Themes文件夹中的特殊资源字典中查找默认样式。默认样式的键由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。

答案 1 :(得分:96)

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

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

然后它将作为您希望应用于控件的任何默认样式的默认查找位置。另请注意,对于默认的样式,它必须将其TargetType和x:Key声明为要设置样式的控件类型。

如果您希望将整个主题和主题切换添加到您的应用程序,这是通过一些编码完成的,此技术仅定义默认资源字典。