Generic.xaml有何特别之处?


153

我一直在尝试找出如何组织ResourceDictionary文件以便与团队其他成员重复使用和共享。

我一直遇到“ Generic.xaml”,但是如果我在MSDN上查找Generic.xaml或只是进行Google搜索,我似乎只会碰到提到它的博客文章和论坛问题,但似乎无法碰到任何真正权威和清晰的东西。

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

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

那么Generic.xaml到底提供了什么优势?如果我不尝试给应用程序多个外观,是否有任何目的(即,如果我只有一个主题)?


6
如果您将其与自定义控件(而不是用户控件)一起使用,则无需将generic.xaml词典合并到您的代码中。
Eternal21'9

Answers:


152

WPF中的每个控件都有一个默认样式,该样式提供控件的default ControlTemplate。WPF在与控件相同的程序集中的Themes文件夹中的特殊资源字典中查找默认样式。默认样式的键由Control.DefaultStyleKeydependency属性提供,该属性的默认值在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。


谢谢,菲尔。因此,您是否在说,如果我只是想为普通的Button控件提供一个新的ControlTemplate(即,不编写我自己的从Button派生的特殊类),那么这将不被视为“主题”的一部分?
devuxer

是的,如果您只是想重新设计标准控件的模板或样式,则可以在UserControl / Window / Application / Whatever级别使用普通的Resources元素。您可以使用带有隐式键的样式(msdn.microsoft.com/en-us/library/…)来更改特定类型的所有控件。
Phil Devaney,

@Zaheylu现在正在工作(我认为MS正在更新他们的文档)
Alan McBee-MSFT 2016年

104

为了使generic.xaml文件(不区分大小写)具有特殊性,必须满足两个条件:

  • 它必须在项目的Themes子根文件夹中
  • 程序集必须标有ThemeInfoAttribute(通常在中AssemblyInfo.cs

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

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


3
您能否阐明“默认样式”的含义?这是否意味着所有按钮将自动采用TargetType为“ Button”的样式?还是我仍然需要x:Key通过书面形式引用<Button Style="{StaticResource MyButtonStyle}" />?如果ResourceDictionary包含多个TargetType为“ Button”的样式,该怎么办?谢谢。
devuxer

3
还有一个问题可以帮助我解决这个问题:Generic.xaml是CSS文件的WPF等效项,它定义了不同元素的默认外观,例如,h1 {color:#00ff00}
devuxer

3
是的,在没有显式引用键的情况下将应用默认样式,并且两个相同的样式将给出错误,即字典中有两个相同的键。是的,您可以以这种方式考虑默认行为。
Kenan EK,2009年

3
只是想补充一下,尽管确实对generic.xaml文件本身有特殊限制,但generic.xaml中的字典条目可以是合并的字典,其条目可以引用任何内容。
Tormod
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.