如何在WPF与.NET 4.5环境下从其他项目加载ResourceDictionary?
解决WPF跨项目引用资源字典崩溃的问题
我之前也踩过跨项目共享WPF资源字典的坑,结合你给出的代码和场景,大概率是这几个常见问题导致的崩溃,咱们一步步来解决:
1. 修正Pack URI的格式错误
你当前写的URI漏掉了关键的component/部分,这是WPF标识程序集内资源的必填路径段。正确的URI应该是:
<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/CommonComponents;component/Resources/Theme.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources>
或者更简洁的等效写法:
<ResourceDictionary Source="/CommonComponents;component/Resources/Theme.xaml" />
2. 检查资源文件的生成操作
确保CommonComponents项目里的Theme.xaml文件的生成操作设置为Resource:
- 右键
Theme.xaml→ 选择「属性」 - 在「生成操作」下拉框里选择「Resource」,然后保存设置
如果这里设置成了Content或者None,WPF在运行时根本找不到这个资源文件,必然会崩溃。
3. 确认项目引用是否正确
检查Project1是否已经正确引用了CommonComponents项目:
- 右键
Project1→ 选择「添加」→「项目引用」 - 在弹出的窗口里勾选
CommonComponents,确保引用的是对应配置(Debug/Release)下的项目
额外验证:全局资源加载
如果窗口级别加载还是有问题,可以尝试在App.xaml里合并资源字典,这样资源会在应用启动时就加载,避免窗口初始化时的资源加载顺序问题:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/CommonComponents;component/Resources/Theme.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
修改完成后,重新生成整个解决方案再运行,应该就能看到Button变成红色的效果了。
内容的提问来源于stack exchange,提问作者Yanick Rochon
相关产品推荐
相关产品推荐

