Generic.xaml 有什么特别之处?
我一直在尝试弄清楚如何组织我的 ResourceDictionary 文件以供重复使用并与团队的其他成员共享。
我不断遇到“Generic.xaml”,但如果我在 MSDN 上查找 Generic.xaml 或只是进行 Google 搜索,我似乎只会收到碰巧提到它的博客文章和论坛问题 - 我似乎无法突然想到任何真正权威和清晰的东西。
Generic.xaml 和 MyRandomlyNamedResourceDictionary.xaml 之间有什么区别? 看起来无论哪种方式,我都必须使用 Source 属性引用存储在库中的 ResourceDictionaries。 例如:
<Application.Resources>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>
那么 Generic.xaml 到底提供了什么优势? 如果我不想给我的应用程序提供多种“外观”(即,如果我只有一个主题),它有什么用处吗?
I've been trying to figure out how to organize my ResourceDictionary files for reuse and sharing with other members of my team.
I keep coming across "Generic.xaml", but if I look on MSDN for Generic.xaml or just do a Google search, I only seem to get blog posts and forum questions that happen to mention it--I can't seem to hit upon anything really authoritative and clear.
What is the difference between Generic.xaml and MyRandomlyNamedResourceDictionary.xaml? It seems like either way, I have to reference ResourceDictionaries stored in libraries with the Source attribute. E.g.,:
<Application.Resources>
<ResourceDictionary
Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>
So what advantage does Generic.xaml provide exactly? Does it have any purpose if I'm not trying to give my application multiple "looks" (i.e., if I have only one theme)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
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。航空.dll。Every Control in WPF has a default Style that provides, among other things, the Control's default
ControlTemplate
. WPF looks for the default style in a special resource dictionary in the Themes folder in the same assembly as the control. The key for the default style is provided by theControl.DefaultStyleKey
dependency property, the default value of which is overridden in each sub-class of Control.The name of the resource dictionary depends on the current Windows theme e.g. on Vista using the Aero theme, the dictionary is called Aero.NormalColor.xaml, on XP using the default theme it is Luna.NormalColor.xaml. If the style is not found in the theme dictionary, it looks in Generic.xaml i.e for controls whose look doesn't depend on the theme.
This only applies to any custom controls you have defined i.e. classes derived from Control, directly or indirectly. You can change the default style for a standard control by deriving from it and calling
DefaultStyleKeyProperty.OverrideMetadata
in the static constructor, but you then have to supply the full style including ControlTemplate.Note that you can tell WPF to look in an external assembly for your default style by using the ThemeInfo attribute. The external assembly must be named
<
YourAssembly>
.<
ThemeName>
.dll e.g. PresententationFramework.Aero.dll.对于特殊的
generic.xaml
文件(不区分大小写),必须满足两个条件:ThemeInfoAttribute
(通常在AssemblyInfo.cs
中)然后它充当您希望应用于控件的任何默认样式的默认查找位置。 另请注意,要使样式成为默认样式,它必须将其 TargetType 和 x:Key 声明为要设置样式的控件类型。
如果您希望将整个主题和主题切换添加到您的应用程序中(通过一些编码来完成),则此技术仅定义默认资源字典。
For a
generic.xaml
file (case insensitive) to be something special, two conditions must be met:ThemeInfoAttribute
(usually inAssemblyInfo.cs
)Then it serves as the default lookup location for any default styles you wish to apply to your Controls. Note also that for a style to be the default it must declare both its TargetType and x:Key as the Type of Control which is to be styled.
If you wish to add entire themes and theme switching to your application, that is accomplished with some coding, this technique merely defines the default resource dictionary.