WPF中ResourceDictionary合并后样式引用Brush失效问题咨询
WPF 自定义控件样式资源字典合并不生效问题解答
核心原因
你的问题本质是WPF的StaticResource资源查找逻辑限制:StaticResource是编译期完成资源查找的,只会在当前资源字典(以及该字典自身合并的其他字典)范围内查找资源,不会向上检索后续父级合并字典。也就是你在Generic.xaml里合并的Brushes字典,对于SHButtonStyle.xaml来说属于父级合并上下文,编译期无法被SHButtonStyle里的StaticResource访问到。
解决方案
你目前在SHButtonStyle.xaml中额外合并Brushes字典的处理方式是完全合规的,不存在错误。如果希望所有资源统一在Generic.xaml中管理,可采用以下方案:
- 将SHButtonStyle.xaml中引用资源的标记从
{StaticResource Background}修改为{DynamicResource Background}:DynamicResource是运行期查找资源,可以检索到父级合并字典中的资源。 - 调整Generic.xaml中合并字典的顺序,必须先合并Brushes字典,再合并SHButtonStyle字典,资源查找会按合并顺序优先匹配先引入的资源:
<ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/TestCustomControl;component/Brushes.xaml"/> <ResourceDictionary Source="/TestCustomControl;component/SHButtonStyle.xaml"/> </ResourceDictionary.MergedDictionaries>
注意事项
建议给自定义资源添加专属前缀避免命名冲突,你当前使用的Background作为资源键过于通用,很容易和系统内置资源键或其他自定义资源键冲突,可修改为比如SHButton_Background这类带业务前缀的名称。
内容的提问来源于stack exchange,提问作者StephenH
相关产品推荐
相关产品推荐

