Generic.xaml 有什么特别之处?

我一直试图弄清楚如何组织我的 ResourceDictionary 文件,以便重用和与团队的其他成员共享。

我经常遇到“ Generic.xaml”,但是如果我在 MSDN 上查找 Generic.xaml,或者只是在 Google 上搜索,我似乎只能看到碰巧提到它的博客文章和论坛问题——我似乎找不到任何真正权威和清晰的东西。

Generic.xaml 和 MyRRandom lyNamedResourceDictionary.xaml 有什么区别?不管怎样,我都必须使用 Source 属性引用存储在库中的 ResourceDictionaries。例如:

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

那么 Generic.xaml 到底提供了什么优势呢?如果我不尝试给我的应用程序多个“外观”(也就是说,如果我只有一个主题) ,它有什么用处吗?

57808 次浏览

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

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

然后,它将作为您希望应用于“控件”的任何默认样式的默认查找位置。还要注意,为了使样式成为默认样式,它必须将其 TargetType 和 x: Key 声明为要设置样式的 Type of Control。

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

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

资源字典的名称取决于当前的 Windows 主题,例如在使用 Aero 主题的 Vista 上,这个字典被称为 Aero。Xaml,在 XP 上使用默认主题是 Luna。NormalColor.xaml.如果在主题字典中没有找到样式,它将在 Generic.xaml 中查找外观不依赖于主题的控件。

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

注意,可以通过使用 ThemeInfo 属性告诉 WPF 在外部程序集中查找默认样式。外部程序集必须命名为 <YourAssembly>.<ThemeName>.dll,例如 PresentationFramework。Aero.dll.