将军有什么特别之处?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

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

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

那么Generic.xaml到底提供了什么优势呢?

提问于
用户回答回答于

WPF中的每个控件都有一个默认样式,除其他外,提供控件的默认值ControlTemplate.WPF在与控件相同的程序集中的主题文件夹中的特殊资源字典中查找默认样式。默认样式的键由Control.DefaultStyleKey属性,其默认值在每个Control子类中被重写。

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

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

请注意,可以通过使用ThemeInfo属性告诉WPF查看默认样式的外部程序集。

用户回答回答于

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

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

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

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

扫码关注云+社区