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
相关产品推荐
相关产品推荐

