什么是 ThemeInfo 属性用于?

35

每当我创建一个新的WPF应用程序或WPF用户控件库时,AssemblyInfo.cs文件都包含以下属性:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, 
    //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly 
    //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
)]

这个ThemeInfo属性是什么?如果我删除它会有什么影响吗?


1
我真高兴能够偶然发现这个!因为我建立了一个自定义的BaseView并将其移动到另一个项目中,所以我一直看到一个空白/黑色窗口。添加这个解决了问题! - Riegardt Steyn
2个回答

20

ThemeInfo 属性指定自动主题机制应该在哪里查找主题字典和通用字典。每个选项可以设置为以下值之一:

  • None(默认):不查找资源字典。
  • SourceAssembly:字典位于当前程序集中。
  • ExternalAssembly:字典位于另一个程序集中,该程序集必须命名为 <AssemblyName>.<ThemeName>.dll,其中 <AssemblyName> 是当前程序集的名称。

如果主题字典为在外部程序集中定义的控件(例如,WPF 控件如 System.Windows.Controls.ProgressBarSystem.Windows.Button)指定了样式,则必须使用 ThemeDictionaryExtension 将应用程序指定为主题字典的来源。


8
但这是什么意思?什么是“主题词典”?什么是“通用词典”?它们有什么作用?它们很重要吗?就像我在问题中问的那样,如果我删除属性,会对任何东西造成影响吗? - Joe White
据我所知,如果您删除它,您的控件将无法从generic.xaml中获取主题,该文件指明了搜索通用主题的位置。 - Arsen Mkrtchyan
1
谢谢!我一直在为如何将基于主题的样式应用到外部定义的控件而苦恼。我完全不知道ThemeDictionaryExtension。一旦我添加了它,一切终于都可以工作了!再次感谢!! - Jason Tyler

5
WPF框架在控件库中使用此属性,作为一种方便的方式将资源应用于控件。
需要考虑到Windows可以运行不同的UI主题(Aero就是其中之一)。Microsoft提供的WPF控件会根据不同的环境主题改变它们的外观。
如果您的应用程序需要这种行为,则可以在控件库项目的“themes”文件夹中创建不同的主题字典。
即使您不需要多主题支持,也很方便将资源放在“generic.xaml”文件中,以便控件可以访问该程序集中的资源。也许您的元素(控件)在一个没有.xaml部分类的.cs文件中定义,并且需要一个存储其所需资源的地方,或者(更可能的是)您有许多WPF元素在同一项目/程序集中共享的资源。
您所指的属性是这些资源映射的元数据。

那么如果我使用标准化的可主题控件,如Button,我就不需要这个属性了吗?我只需要在以下情况下才需要它:(a)我从头开始编写自己的控件,并希望在 Aero vs Luna 等方面看起来不同,或者(b)我的程序集有一个 generic.xaml 文件?在这两种情况下,默认设置都不起作用,我需要该属性吗? - Joe White
是的,你在这方面走得没错。但是,既然我们正在谈论你自己的控件,就没有任何“默认”的资源。唯一可能存在的默认资源是通过“generic.xaml”文件到达的。如果存在主题特定的资源字典条目,则该字典中的资源将被覆盖。 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接