WPF项目引用res文件夹图片作为资源时提示资源找不到异常如何解决
WPF 加载项目内图片资源报找不到异常解决方案
问题现象
将项目res文件夹下的图片作为资源引用时,抛出System.IO.IOException异常,错误描述为 The resource "res/rook.png" cannot be found.,异常发生在构造pack uri的代码行。
排查及解决步骤
- 检查图片文件的生成操作配置
解决方案资源管理器中找到res文件夹下的所有png图片,右键点击→属性,将「生成操作」设置为Resource,「复制到输出目录」可设置为「不复制」(Resource模式会将图片嵌入程序集,无需单独输出到目录)。这是该问题最常见的诱因,大部分情况是图片默认生成操作被设为「内容」或「无」,没有被打包到程序集中导致找不到。 - 校验程序集名称匹配
你代码中uri使用的/ChessWPF;component/前缀对应项目的程序集名称,右键点击项目→属性→「应用程序」标签页,确认「程序集名称」字段的值和uri中的ChessWPF完全一致,如果你修改过项目名称此处要同步更新。 - 确认路径和文件名大小写匹配
WPF的pack uri对大小写敏感,确认:- 存放图片的文件夹名称确实为
res,和uri中的路径一致 - 所有图片文件名均为全小写,比如车对应的图片必须是
rook.png,不能是Rook.png,因为你的代码中用了ToLower()处理文件名。
- 存放图片的文件夹名称确实为
- 简化uri写法排查
如果图片和代码在同一个程序集内,可以省略程序集名称前缀,简化uri写法测试:chessPiece.Source = new BitmapImage( new Uri($"pack://application:,,,/res/{pngFileName}.png", UriKind.Absolute));
修正后的参考代码
chessField = new ChessField(); chessField.fillField(); for (int i = 0; i < 64; i++) { Border border = new Border(); border.Background = i % 2 == 0 ? Brushes.White : Brushes.Black; Image chessPiece = new Image(); if (chessField.Field[i / 8, i % 8] != null) { string pngFileName = chessField.Field[i / 8, i % 8].pieceType.ToString().ToLower(); // 同程序集下可省略程序集名称,简化写法 chessPiece.Source = new BitmapImage( new Uri($"pack://application:,,,/res/{pngFileName}.png", UriKind.Absolute)); } border.Child = chessPiece; xamlField.Children.Add(border); }
内容的提问来源于stack exchange,提问作者byKrem
相关产品推荐
相关产品推荐

