Generic.xaml有什么特别之处?

dev*_*xer 146 wpf xaml themes

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

我一直遇到"Generic.xaml",但如果我在MSDN上查看Generic.xaml或者只是进行谷歌搜索,我似乎只会发现博客文章和论坛问题 - 我似乎无法打击任何真正权威和清晰的东西.

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

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

那么Generic.xaml有什么优势呢?如果我不试图给我的应用程序多个"外观"(即,如果我只有一个主题),它是否有任何目的?

Phi*_*ney 145

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

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

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

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


Ken*_* K. 99

对于generic.xaml特殊情况的文件(不区分大小写),必须满足两个条件:

  • 它必须位于项目的Themes子根文件夹中
  • 组件必须标有ThemeInfoAttribute(通常在AssemblyInfo.cs)

然后,它将作为您希望应用于控件的任何默认样式的默认查找位置.另请注意,要将样式设置为默认样式,必须将其TargetType和x:Key声明为要设置样式的控件类型.

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

  • 你能澄清"默认风格"的含义吗?这是否意味着所有按钮都会自动呈现TargetType为"Button"的样式?或者我仍然需要通过编写`<Button Style ="{StaticResource MyButtonStyle}"/>`来引用`x:Key`?如果ResourceDictionary包含多个TargetType为"Button"的Style,会发生什么?谢谢. (3认同)
  • 还有一个问题可以帮助我解决这个问题:Generic.xaml是一个CSS文件的WPF等价物,它定义了不同元素的默认外观,例如`h1 {color:#00ff00}`? (3认同)
  • 是的,默认样式将在不显式引用键的情况下应用,并且两个相同的样式会给出错误,即字典中有两个相同的键.是的,关于默认行为,你可以这样思考. (3认同)
  • 只是想补充一点,尽管对generic.xaml文件本身有特殊限制,但generic.xaml中的字典条目可以是合并字典,其条目可以引用任何内容. (3认同)