无法找到资源

10

我不确定这是否是一个错误,但我一直得到运行时IOException错误,说找不到资源。

在我的应用程序(C#,WPF)中,我根据数据库状态在画布背景中加载一些图像。 问题是,我无法加载最后一个(按字母顺序排序的)文件。例如,我有15张图像在文件夹中。我可以先加载14个没有问题。但是最后一个始终抛出异常。

我百分之百确定,我在文件夹中有这张图片(请参见!下面的图像屏幕截图)。 而且我已经写了14个,都没有任何问题,只有最后一个会抛出异常。

这是WPF-C#中的错误还是我做错了什么?

抛出异常的代码:

canvas_status.Background = new ImageBrush(new BitmapImage(new Uri(BaseUriHelper.GetBaseUri(this), @"Images\" + statusName + ".png")));

canvas_name.Background = new ImageBrush(new BitmapImage(new Uri(BaseUriHelper.GetBaseUri(this), @"Images\" + statusName + bulheadName + ".png")));

错误:

IOException was unhalded
Cannot locate resource 'view/images/panel_uzavreno_d.png'.

图片(要查看更高分辨率,请单击图像右键并单击“显示图像”或类似选项):

printscreen


@piggy请不要使用除Imgur以外的其他服务的截图,因为它们往往会被删除或屏蔽,这将使您的问题对未来遇到相同问题的访问者无用。 - Nasreddine
啊好的:]. 抱歉,它现在在imgur上(感谢您的编辑)。 - tomdelahaba
你所有的图片都设置为“资源”且不复制了吗? - evanb
将现有项添加到解决方案资源管理器中(不是在资源中):使用“添加现有项”功能。 - tomdelahaba
在我的情况下(XAML 资源从另一个不在根目录的 XAML 文件引用),只有相对路径才能起作用:“./Subdir/resource.xaml”。 - dudeNumber4
显示剩余2条评论
2个回答

37

我遇到了类似的问题: IOException,无法定位程序集中实际存在的png资源。

我发现通过显式指定程序集名称可以解决此问题,即使调用者与资源在同一个程序集中。

以下是使用打包URI语法的示例:

pack://application:,,,/MyAssemblyName;component/MyResourcesFolder/MyImage.png

(关于包URI的更多信息请参见http://msdn.microsoft.com/zh-cn/library/aa970069.aspx

编辑:在指定程序集名称后,我还需要清理项目。问题在构建后会重新出现,但在清理中间产品后得到解决。 这绝对是Visual Studio中的一个错误。


1
看起来Expression Blend 4的设计师也有类似的bug。我试图在设计时加载一个样式文件(位于同一程序集中),以解决Blend的另一个bug/特性(它无法从App.xaml中找到资源),发现你明确包含程序集名称的方法是解决其设计时“未找到资源”的异常的唯一方法。谢谢! - Jason Frank
是的,在 .NET 4.5 的 WPF 桌面应用程序中遇到了这个问题,这个解决了它。 - Kieran Senior
1
谢谢! 清理项目是使打包URI正常工作的关键。很高兴我读完了你的整篇文章。 - ecreif
是的,同样的问题。不过是在VS2013中。 - Jef Patat
明确指定程序集名称是关键。在谷歌上没有其他任何帮助。 - NielW

26

你需要将该图片的构建操作(build action)设置为“Resource”类型。

右键单击文件 >> 属性 >> 将“Build Action”设置为“Resource”


似乎图像也需要添加到资源文件中。 - Carlos Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接