You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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对大小写敏感,确认:
    1. 存放图片的文件夹名称确实为res,和uri中的路径一致
    2. 所有图片文件名均为全小写,比如车对应的图片必须是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:06:04