请解释什么是主题和generic.xaml?
请解释什么是主题和generic.xaml?
我一直在试图找出如何组织我的ResourceDictionary文件以便与团队中的其他成员共享和重用。
我一直看到“Generic.xaml”,但如果我在MSDN上搜索Generic.xaml或者只是进行谷歌搜索,我似乎只能找到提到它的博客文章和论坛问题,我似乎找不到真正权威和清晰的内容。
Generic.xaml和MyRandomlyNamedResourceDictionary.xaml有什么区别?无论哪种方式,我都必须使用Source属性引用存储在库中的ResourceDictionaries。例如:
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" 那么,Generic.xaml到底有什么优势呢?如果我不打算给我的应用程序提供多种“外观”(即只有一个主题),它有什么作用吗?
themes和generic.xaml是WPF中用于定义控件默认样式的概念和文件。themes文件夹是generic.xaml文件所在的文件夹,而generic.xaml文件则是WPF应用程序中默认的资源字典文件。要让generic.xaml文件起作用,需要满足两个条件:一是generic.xaml文件必须在项目的Themes子目录下,二是程序集必须标记有ThemeInfoAttribute属性。
generic.xaml文件中定义的样式会作为默认样式应用于控件。要使样式成为默认样式,必须同时指定TargetType和x:Key属性,其中TargetType指定要应用样式的控件类型。
如果希望为应用程序添加主题和主题切换功能,可以通过编码实现,而generic.xaml文件仅定义默认的资源字典。
关于"default styles"的含义,请问是指所有按钮都会自动应用TargetType为"Button"的样式吗?还是我仍然需要通过写""来引用x:Key?如果ResourceDictionary中包含多个TargetType为"Button"的样式会发生什么?谢谢。
是的,如果没有显式引用x:Key,那么默认样式会自动应用于按钮控件。如果ResourceDictionary中包含两个相同TargetType的样式,则会报错,提示字典中存在两个相同的键。是的,你可以把generic.xaml文件看作是WPF中的CSS文件,用于定义不同元素的默认外观,比如"h1 {color:#00ff00}"。
还想补充一点,虽然generic.xaml文件本身有一些特殊限制,但是在generic.xaml文件中的资源字典可以是一个合并的字典,其中的条目可以引用任何内容。
主题和generic.xaml是用于定义WPF控件的默认样式和控件模板的重要概念。每个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在外部程序集中查找默认样式。外部程序集的名称必须是
所以你是说,如果我只想为普通Button控件提供一个新的ControlTemplate(即不编写自己的专门从Button派生的类),这不会被视为“主题”的一部分吗?
是的,如果您只想重新模板化或重新样式化标准控件,那么您可以在UserControl/Window/Application/Whatever级别使用常规的资源元素。您可以使用具有隐式键的样式(msdn.microsoft.com/en-us/library/…)来更改特定类型的所有控件。
现在它已经可以工作了(我认为微软正在更新他们的文档)。