Generic.xaml 有啥特别之处?

Posted

技术标签:

【中文标题】Generic.xaml 有啥特别之处?【英文标题】:What is so special about Generic.xaml?Generic.xaml 有什么特别之处? 【发布时间】:2010-11-16 18:21:10 【问题描述】:

我一直在尝试弄清楚如何组织我的 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 究竟提供了什么优势呢?如果我不想给我的应用程序提供多种“外观”(即,如果我只有一个主题),它是否有任何目的?

【问题讨论】:

如果您将其与自定义控件(而不是用户控件)一起使用,则无需将 generic.xaml 字典合并到您的代码中。 【参考方案1】:

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 在外部程序集中查找您的默认样式。外部程序集必须命名为 &lt;YourAssembly&gt;.&lt;ThemeName&gt;.dll 例如演示框架.Aero.dll。

【讨论】:

谢谢,菲尔。那么你是说如果我只是想为普通的 Button 控件提供一个新的 ControlTemplate(即,不编写我自己的派生自 Button 的特殊类),这不会被视为“主题”的一部分? 是的,如果您只想重新模板化或重新设置标准控件的样式,那么您可以在 UserControl/Window/Application/Whatever 级别使用普通的 Resources 元素。您可以使用带有隐式键 (msdn.microsoft.com/en-us/library/…) 的样式来更改某种类型的所有控件。 @Zaheylu 现在可以工作了(我认为 MS 正在更新他们的文档)【参考方案2】:

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

必须在项目的Themes子根目录下 程序集必须标有ThemeInfoAttribute(通常在AssemblyInfo.cs

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

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

【讨论】:

你能澄清一下“默认样式”是什么意思吗?这是否意味着所有按钮都会自动采用 TargetType 为“Button”的样式?还是我还需要通过写&lt;Button Style="StaticResource MyButtonStyle" /&gt; 来引用x:Key?如果 ResourceDictionary 包含多个 TargetType 为“Button”的 Style,会发生什么?谢谢。 另一个问题可以帮助我解决这个问题:Generic.xaml 是定义不同元素默认外观的 CSS 文件的 WPF 等价物吗,例如,h1 color:#00ff00 是的,默认样式将在不显式引用键的情况下应用,并且两个相同的样式会给出字典中有两个相同键的错误。是的,你可以这样想,关于默认行为。 只是想补充一点,虽然 generic.xaml 文件本身有特殊限制,但 generic.xaml 中的字典条目可以是一个合并字典,其条目可以引用任何内容。

以上是关于Generic.xaml 有啥特别之处?的主要内容,如果未能解决你的问题,请参考以下文章

crontab 中的 % 有啥特别之处?

使用 StringBuilder 而不是 StringBuffer 有啥特别之处 [重复]

nRF52840芯片有啥特别之处?

代码签名证书有啥特别之处?

以“tree”开头的 gcc 标志有啥特别之处?

Java XML DOM:id 属性有啥特别之处?