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

.NET MAUI从资源加载图片遇到的系列技术问题

.NET MAUI 图片加载相关问题解答

示例代码

IImage image;
Assembly assembly = GetType().GetTypeInfo().Assembly;
using (Stream stream = assembly.GetManifestResourceStream("Solitaire.Resources.Images.deck.png"))
{
#if IOS || ANDROID
        // PlatformImage isn't currently supported on Windows.
        image = PlatformImage.FromStream(stream);
#elif WINDOWS
        image = new W2DImageLoadingService().FromStream(stream);
#endif
}

1. 为何所有赋值代码会被置灰?

这是Visual Studio编辑器的静态分析bug。当调试目标设为Windows Machine时,IDE本应只灰化#if IOS || ANDROID分支的代码,但预处理指令解析逻辑出错,误将所有分支的赋值代码标记为“当前平台不生效”。这只是编辑器显示层面的问题,不影响实际编译和运行逻辑。

2. 为何断点仍能命中?

断点命中说明代码实际在执行。编辑器的置灰是静态判断结果,而编译时针对Windows平台会正确保留#elif WINDOWS分支的代码,编译后的程序集里这段逻辑完全有效,所以调试时断点能正常触发,和编辑器的显示状态无关。

3. Microsoft.Maui.Graphics.Win2D是什么?

它是.NET MAUI Graphics库的Windows平台专属实现包,基于Windows原生的Win2D 2D图形渲染库开发,为MAUI提供Windows平台下的图形渲染、图片处理等底层能力,是MAUI跨平台图形系统的一部分。

4. 为何using未被识别却能运行?

这里的“未被识别”是编辑器静态检查的假象:

  • MAUI Windows项目默认已引用Microsoft.Maui.Graphics.Win2D包,且该包的命名空间可能被项目的全局using自动导入,编译时能正常找到类型;
  • 当代码被#elif WINDOWS包裹时,编辑器的静态检查可能因预处理指令的存在,未实时识别全局using的作用,导致显示上的“未识别”提示,但不影响编译运行。

5. W2DImageLoadingService是什么?如何获取?

它是Microsoft.Maui.Graphics.Win2D包中的类,负责在Windows平台上从流加载图片,并转换为MAUI Graphics标准的IImage对象。
获取方式:MAUI Windows项目默认会自动引用Microsoft.Maui.Graphics.Win2D NuGet包,无需额外操作,直接在Windows分支代码中使用即可。

6. 当代码被#elif WINDOWS包裹时,实际运行时是否使用了W2DImageLoadingService类?若使用了,为何能实现?

实际运行时确实在使用这个类:

  • 编译Windows平台的MAUI项目时,编译器会保留#elif WINDOWS分支的代码,剔除其他平台分支;
  • Microsoft.Maui.Graphics.Win2D是项目的依赖项,编译时该类的代码会被打包进程序集;
  • 运行时,代码创建W2DImageLoadingService实例,调用其FromStream方法加载图片,返回符合IImage接口的Windows平台图片对象,从而实现跨平台的图片加载逻辑。

内容的提问来源于stack exchange,提问作者Anders Lindén

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:07:30