首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩展/覆盖资源字典中的样式

扩展/覆盖资源字典中的样式
EN

Stack Overflow用户
提问于 2009-07-30 20:25:36
回答 2查看 9.3K关注 0票数 8

我在我的WPF应用程序的一个单独的dll中有一个BaseSkin和多个UserSkins。

根据谁在使用应用程序,基本外观和其中一个用户外观将被合并到资源字典中,并加载以供应用程序使用。

我的目标是能够在BaseSkin文件中指定样式,然后在特定的UserSkin文件上能够覆盖它,更改我需要的任何属性。

我知道我可以通过使用BasedOn属性来实现这一点:

基础:

代码语言:javascript
复制
<Style x:Key="ButtonBg" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
</Style>

用户:

代码语言:javascript
复制
<Style x:Key="CustomButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBg}">
    <Setter Property="Background" Value="Blue"/>
</Style>

问题是,现在元素必须有一个CustomButtonBg样式,而这个样式可能实际上并没有实现。有没有办法让这两种样式使用相同的键( ButtonBg ),当它们合并时,让应用程序首先在User中查找名为ButtonBg的样式,如果不存在,则使用base中的样式?

我在想,如果我可以在BasedOn属性中指定指向BaseSkin文件的程序集名称,那么当我为它们提供相同的密钥时,就可以避免命名错误,但我找不到任何方法来做到这一点。其他选择是,即使没有任何变化,也只强制实现每种样式,或者以编程方式检查外观,但这些都是最后的选择。

EN

Stack Overflow用户

回答已采纳

发布于 2009-07-30 20:38:37

您可以尝试利用资源查找逻辑。当WPF试图通过键查找资源时,它首先查找当前元素的ResourceDictionary,然后查找它的父元素,然后查找该元素的父元素,依此类推。

既然您说它是用户的条件,那么它可以合并到Window级别的ResourceDictionary中,而您的原始库则位于Application级别。

编辑:我有更好的信息。来自MSDN on Merged Dictionaries

合并字典行为

合并字典中的资源在资源查找范围中占据一个位置,该位置恰好在它们合并到的主资源字典的范围之后。尽管资源键在任何单独的字典中都必须是唯一的,但一个键可以在一组合并的字典中多次出现。在这种情况下,返回的资源将来自在MergedDictionaries集合中按顺序找到的最后一个字典。如果MergedDictionaries集合是在XAML中定义的,那么集合中合并字典的顺序就是标记中提供的元素的顺序。如果在主字典和已合并的字典中定义了键,则返回的资源将来自主字典。这些作用域规则同样适用于静态资源引用和动态资源引用。

这意味着您可以在不同的ResourceDictionary中定义您的基础皮肤,并将其合并到另一个ResourceDictionary中。将用户皮肤放在后者中,它将首先找到它,否则它将一直向下钻到包含Base的合并字典。你的每个用户字典都可以合并基本字典,你只需将用户字典加载到应用程序中,而不是将两者分别加载。

票数 11
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1209128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档