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

Xamarin Forms中使用GetResource加载图片失败求助

问题排查与解决

核心问题点

  • 资源类型配置错误
    你当前项目配置里把图片标记为<Resource>,但嵌入式资源需要设置为<EmbeddedResource>,否则无法通过资源加载方法读取。
  • 资源路径不匹配
    嵌入式资源的路径格式为项目根命名空间 + 文件夹层级,从你的配置看图片在Properties文件夹下,假设项目根命名空间是YourProjectName,正确路径应为YourProjectName.Properties.testimg.jpg,而非代码里的Resources.drawable.testimg.jpg。
  • 异步加载导致的空值问题
    ImageSource.FromResource是异步加载逻辑,你直接实例化Image后转SKBitmap,此时图片还未完成加载,必然返回null。

修正步骤

1. 调整项目资源配置

将项目文件中的资源类型改为嵌入式资源:

<ItemGroup>
  <EmbeddedResource Include="Properties\testimg.jpg">
    <CopyToOutputDirectory>Never</CopyToOutputDirectory>
  </EmbeddedResource>
</ItemGroup>

2. 重写图片加载代码

直接通过程序集获取资源流,同步加载为SKBitmap,避免异步问题:

private void canvasView_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs args)
{
    SKImageInfo info = args.Info;
    SKSurface surface = args.Surface;
    SKCanvas canvas = surface.Canvas;

    SKBitmap _preloadedBitmap = null;
    // 替换为你的项目根命名空间
    var resourcePath = "YourProjectName.Properties.testimg.jpg";
    using (var stream = typeof(YourCurrentClass).Assembly.GetManifestResourceStream(resourcePath))
    {
        if (stream != null)
        {
            _preloadedBitmap = SKBitmap.Decode(stream);
        }
    }

    canvas.Clear();
    if (_preloadedBitmap != null)
    {
        canvas.DrawBitmap(_preloadedBitmap, 200, 200);
    }
}

注意:将YourProjectName替换为实际项目根命名空间,YourCurrentClass替换为当前包含该方法的类名。

3. 验证正确资源路径

如果不确定资源路径,可遍历所有嵌入式资源名称确认:

var assembly = typeof(YourCurrentClass).Assembly;
foreach (var resourceName in assembly.GetManifestResourceNames())
{
    Console.WriteLine(resourceName);
}

内容的提问来源于stack exchange,提问作者TryingAgain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:42:44