如何让WPF类库中仅指定TargetType的generic.xaml样式被引用应用正常使用
样式未生效的根本原因
Themes/generic.xaml的原生设计定位是承载类库内部自定义控件的默认主题样式,仅当WPF框架渲染类库中自行编写的、继承自Control基类的自定义控件时,才会自动从该位置查找匹配的默认样式。
即便类库配置了完全正确的ThemeInfo特性,框架也不会主动把generic.xaml内的所有资源自动注入到引用类库的应用的全局资源层级中。当前在generic.xaml中定义的针对原生Border控件的无键样式,因为没有进入应用的资源查找路径,自然无法对应用内的原生控件生效。
当前配置的适配错位
- 你的目标是复用面向应用全局的通用主题样式,但generic.xaml的机制完全不支持自动将这类全局样式同步到所有引用方
- 仅添加项目引用不会触发类库内XAML资源的自动加载,WPF的资源查询严格遵循「控件本地资源→页面资源→应用资源→系统主题资源」的固定路径,没有被显式合并到资源树中的类库资源,永远不会被匹配到
可直接落地的修正方案
- 调整资源存储位置:将原本放在generic.xaml中的通用主题样式,移出到类库内独立的资源字典文件中(例如路径设为
Themes/SharedTheme.xaml),generic.xaml仅保留类库自定义控件的默认样式即可 - 在所有引用类库的WPF应用的
App.xaml中,显式将类库的通用资源字典合并到应用级资源集合中,示例写法如下:<!-- 应用程序定义的App.xaml --> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/你的类库程序集名称;component/Themes/SharedTheme.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> - 完成上述配置后,类库中定义的无键样式、带键画刷、模板等资源,就会沿着正常的资源查找路径,在两个WPF应用中全局生效
内容的提问来源于stack exchange,提问作者AxD
相关产品推荐
相关产品推荐

