WPF设计视图无法创建UserControl实例 Debug报错Release运行正常
WPF嵌套UserControl设计时资源找不到问题修复
问题背景
我有一个名为LoadingIndicatorControl的UserControl,用于在其他控件执行加载操作时展示加载状态。该控件XAML定义如下:
<StackPanel HorizontalAlignment="Stretch" Visibility="{Binding Loading, Converter={StaticResource Bool2Vis}}"> <Image x:Name="imgLoadingSpinner" gif:ImageBehavior.AnimatedSource="pack://application:,,,/Images/Loading_Spinner.gif" HorizontalAlignment="Right" Width="30" Height="30" /> </StackPanel>
在其他视图中按如下方式嵌套引用该控件:
<uc:LoadingIndicatorControl Loading="{Binding Loading}" DockPanel.Dock="Bottom"/>
问题现象
- 应用运行时无编译错误,加载指示器可按预期正常展示
- 仅设计时出现与该用户控件相关的图像资源错误,上述gif文件的Build Action已设置为
Resource - 宿主视图的设计界面触发报错,错误详情提示为
Cannot locate resource 'images/loading_spinner.gif' - 单独打开
LoadingIndicatorControl的设计视图时,可正常定位loading_spinner.gif资源,无任何报错 - 将生成配置切换为
Release模式时设计时错误不会出现,仅在使用Debug配置时会触发该错误 - 当前开发环境为Visual Studio Professional v16.11.16
已尝试的排查操作
- 多次清理并重新生成解决方案
- 关闭VS2019后重新打开
- 清理解决方案、关闭VS、重启后重新生成
- 将
Loading_Spinner.gif的Build Action设置为Embedded Resource(原设置为Resource,该设置下运行时可正常工作) - 尝试切换Any CPU、x64、x86等不同平台目标
可行修复方案
方案1:补全Pack URI的程序集限定
该问题是VS2019 16.11版本WPF设计器的已知解析bug:嵌套引用UserControl时,Debug模式下设计器会默认从宿主视图所在程序集寻址无程序集限定的Pack URI资源,不会自动识别资源所属的UserControl所在程序集。
直接将gif资源的路径修改为带程序集名的完整绝对路径即可解决,格式如下:
gif:ImageBehavior.AnimatedSource="pack://application:,,,/[UserControl所在项目的实际程序集名称];component/Images/Loading_Spinner.gif"
替换时去掉方括号,填入项目真实程序集名即可。
方案2:统一Debug模式下的项目输出路径
该版本设计器在Debug模式下加载资源时会优先从当前宿主项目的输出目录寻址,如果UserControl所在项目和宿主项目的Debug输出路径不一致,就会出现资源找不到的问题。
将解决方案内所有相关项目的Debug配置输出路径统一修改为解决方案根目录下的统一输出文件夹(例如..\Build\Debug\),重新生成解决方案即可。
方案3:屏蔽无效设计时错误
该错误仅为设计器解析bug,完全不影响运行时效果,无需修改代码配置也可直接屏蔽该提示:
- 打开「工具->选项->XAML设计器」
- 取消勾选「在设计器中显示运行时错误」选项
- 重启VS后该错误将不再提示。
内容的提问来源于stack exchange,提问作者WSC
相关产品推荐
相关产品推荐

