代码之家  ›  专栏  ›  技术社区  ›  devuxer

generic.xaml有什么特别之处?

  •  140
  • devuxer  · 技术社区  · 16 年前

    我一直在努力找出如何组织我的ResourceDictionary文件以便与我的团队中的其他成员重用和共享。

    我不断地遇到“generic.xaml”,但是如果我在msdn上查找generic.xaml或只是搜索谷歌,我似乎只会收到博客文章和论坛问题,而这些恰好提到了它——我似乎无法找到真正权威和清晰的东西。

    generic.xaml和myrandomlynamedresourcedictionary.xaml之间的区别是什么?不管是哪种方式,我都必须使用source属性引用存储在库中的资源字典。例如。,:

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

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

    2 回复  |  直到 9 年前
        1
  •  140
  •   akjoshi HCP    9 年前

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

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

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

    注意,通过使用themeinfo属性,可以告诉WPF在外部程序集中查找默认样式。外部程序集必须命名 < 你的集会 > . < 主题名 > .dll,例如presentationframework.aero.dll。

        2
  •  95
  •   Fabrício Matté    16 年前

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

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

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

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

    推荐文章