VS2015调试WPF应用触发ResourceDictionary.DeferrableContent异常求助
System.Windows.ResourceDictionary.DeferrableContent异常问题 我来帮你搞定这个头疼的WPF调试异常!这个错误通常是因为UserControl的资源字典加载出了问题,咱们从几个常见的排查方向入手:
检查资源字典引用路径
先看<UserControl.Resources>里引用的所有ResourceDictionary的Source路径,不管是相对路径还是pack URI,都要确保拼写正确、文件真实存在。比如项目内资源的pack URI格式应该是pack://application:,,,/你的程序集名称;component/资源文件夹/资源文件名.xaml,相对路径要注意UserControl所在的文件夹层级,别写错了../或者./。排查资源字典内部的XAML错误
很多时候这个外层异常是因为引用的资源字典本身有语法问题——比如未闭合的标签、属性拼写错了、资源Key重复、绑定表达式写歪了。打开对应的资源字典文件,逐行检查,尤其注意那些自定义样式、模板里的细节,VS的XAML编辑器其实会在错误行标红,仔细看看有没有漏掉的提示。确认自定义类型的命名空间和程序集引用
如果资源字典里用到了自定义控件、转换器这类类型,一定要检查XAML顶部的命名空间声明是不是正确的,比如xmlns:local="clr-namespace:你的命名空间",有没有写错命名空间名称,对应的程序集是不是已经添加了引用。要是类型不存在或者命名空间错了,加载时就会触发这个异常。排查延迟加载相关的依赖问题
DeferrableContent和资源的延迟加载有关,如果资源字典里的内容依赖了某个还没初始化的对象,就可能出问题。试试移除资源字典里的延迟加载设置(如果有的话),或者调整资源加载的顺序,确保依赖项在资源加载前已经准备就绪。清理重建项目,干掉缓存
有时候Visual Studio的缓存会搞出莫名其妙的问题,试试先执行Build -> Clean Solution,然后手动删除项目的bin和obj文件夹,再重新生成整个解决方案,很多时候这种“玄学”问题就会消失。
举个简单的例子,如果你的<UserControl.Resources>代码是这样的:
<UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/MyWpfApp;component/Resources/GlobalStyles.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources>
那你就要确认GlobalStyles.xaml确实在Resources文件夹里,路径里的程序集名称MyWpfApp和项目的程序集名称一致,而且这个资源字典里没有XAML语法错误。
内容的提问来源于stack exchange,提问作者Erik Thysell

