我一直在努力弄清楚如何组织我的ResourceDictionary文件,以便重复使用并与我团队的其他成员共享。
我一直遇到“Generic.xaml”,但如果我在MSDN上查看Generic.xaml或者只是进行谷歌搜索,我似乎只会提到博客文章和论坛问题 - 我可以'似乎对任何真正权威和清晰的东西都有所帮助。
Generic.xaml和MyRandomlyNamedResourceDictionary.xaml有什么区别?看起来无论哪种方式,我都必须使用Source属性引用存储在库中的ResourceDictionaries。 。E.g,:
<Application.Resources>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>
那么Generic.xaml有什么优势呢?如果我不试图给我的应用程序多个“外观”(即,如果我只有一个主题),它是否有任何目的?
答案 0 :(得分:140)
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在外部程序集中查找默认样式。外部程序集必须命名为<
YourAssembly >
。<
ThemeName >
。dll例如PresententationFramework.Aero.dll。
答案 1 :(得分:96)
对于generic.xaml
文件(不区分大小写)是特殊的,必须满足两个条件:
ThemeInfoAttribute
(通常在AssemblyInfo.cs
)然后它将作为您希望应用于控件的任何默认样式的默认查找位置。另请注意,对于默认的样式,它必须将其TargetType和x:Key声明为要设置样式的控件类型。
如果您希望将整个主题和主题切换添加到您的应用程序,这是通过一些编码完成的,此技术仅定义默认资源字典。