我的ThemeInfo
文件中存在AssemblyInfo.cs
个属性。我正在尝试编写自定义控件。自定义控件位于名为“MyCustomControls.dll”的dll中。此外,控件本身来自另一个自定义控件,该控件位于另一个名为“MyAnotherCustomControls.dll”的dll中。
我在MSDN上读到必须使用2个参数声明ThemeInfo,这些参数负责控件主题特定位置和通用特定位置,但我不知道什么是“主题”和什么是“通用”。我怎样才能更好地理解这两个?
如果有人能从头开始向我解释什么是“通用”和什么是“主题”。此外何时使用“通用”或“主题”。 WPF系统如何使用这两个系统?我真的需要用简单的英语解释,所以如果您要发布MSDN链接,请节省您的时间。我阅读了有关ThemeInfo的msdn文档,但我得不到它。
还有人可以告诉我如何使用ThemeInfo
告诉我的“MyCustomControls.dll”来使用“MyAnotherCustomControls.dll”中定义的字典资源吗?这甚至可以通过ThemeInfo来做,还是我必须处理“MyCustomControls.dll”中的MergedDirectories?我希望WPF系统负责查找资源,以便我可以使用“MyAnotherCustomControls.dll”中的样式键,而无需在“MyCustomControls.dll”中添加合并目录。
答案 0 :(得分:5)
我在MSDN上读到,必须使用2个参数声明ThemeInfo,这些参数负责控制主题特定位置和通用特定位置,但我不知道什么是"主题"什么"泛型"。我怎样才能更好地理解这两个?
基本上,WPF框架将查找名称与OS主题名称匹配的xaml资源。因此,如果你在XP上运行蓝色主题,那将是" luna.normal.xaml"。如果找不到具有该确切名称的名称,则会查找" generic.xaml"。实际上我认为他们会寻找" classic.xaml"首先,如果他们找不到与特定操作系统匹配的那个,那么他们会寻找generic.xaml。您可以将generic.xaml视为默认资源。
ThemeInfo属性只是告诉WPF 这些资源的定义。有3个选项:
This article on MSDN对于提供有关此信息的信息并不是很糟糕。
也有人可以告诉我如何通过使用ThemeInfo告诉我" MyCustomControls.dll"使用" MyAnotherCustomControls.dll"中定义的字典资源?这甚至可以通过ThemeInfo来实现,还是我必须在" MyCustomControls.dll"中处理MergedDirectories?我希望WPF系统负责查找资源,以便我可以使用" MyAnotherCustomControls.dll"中的样式键,而无需在" MyCustomControls.dll"中添加合并目录。
您无法使用ThemeInfo告诉WPF它应该在某个任意程序集中查找您的资源。如果您没有设置或覆盖 DefaultStyleKey ,就像通常在定义自定义控件时所做的那样,那么它应该继续使用具有DefaultStyleKey的基类的资源。设置/覆盖默认资源。
但应注意 local 样式分辨率(即未设置控件的Style属性且WPF从元素所在的位置查看并沿视觉/逻辑方向行进树寻找可能隐含影响该元素的样式)总是寻找其Key与类的确切类型匹配的Style。因此,如果具有一个Style,其TargetType(以及放置在ResourceDictionary中的默认Key)是在Window的Resources中定义的TextBox,它将影响该Window中的所有TextBox实例(除非它们在视觉中更接近Style)树 - 即在元素之间的资源中定义的一些祖先 - 或其Style属性设置)。但是,如果您有一个派生自TextBox的类(例如,类MyTextBox:TextBox),那么它将不会拾取/使用该Style。相反,它将寻找TargetType / Key为typeof(MyTextBox)的Style。解决这个问题的一种方法是将Style属性设置为基本类型的DynamicResource。 e.g。
public MyTextBox()
{
this.SetResourceReference(StyleProperty, typeof(TextBox));
}
基本上,这会在控件的Style属性上设置一个本地值,该属性正在为一个Style进行动态资源查找,其Key(以及因此未设置x:Key的样式的TargetType)是指定的类型(在这种情况下的TextBox)。
正如您所指出的那样,另一种方法是在程序集中本地定义xaml文件,以用于基类'程序集定义然后将ResourceDictionary添加到其MergedDictionaries,它使用pack uri notation来引用基类的程序集中的资源。如果您要设置DefaultStyleKey,那么您可能需要定义一个其TargetType为您的类的样式'键入每个ResourceDictionaries,然后将BasedOn设置为StaticResource,其中资源键是基类的类型。听起来好像你不应该这样做。