WinUI3如何通过后台代码显示外部类库的嵌入资源图片
WinUI3 引用外部类库图片资源方案
问题场景
公共类库 foo.common 内存储了若干生成操作设置为 Embedded Resource 或 Resource 的 png 格式图片,需要在同解决方案下的 foo.ui WinUI3 应用中展示这些图片。
最初尝试以下直接引用路径的方式全部失败:
XAML 直接赋值 Source:
<Image Source="ms-appx://Foo.Common/Assets/Images/foo.png"/> <Image Source="ms-appx:///Foo.Common/Assets/Images/foo.png"/>
C# 后台代码创建控件:
new Image { Source = new BitmapImage { UriSource = new Uri("ms-appx://Foo.Common/Assets/Images/foo.png") } }
后台代码读取嵌入资源方案
要通过后台代码读取 Embedded Resource 类型的资源,先通过程序集读取嵌入资源的接口获取对应资源流,再通过扩展方法将流转换为 ImageSource 类型即可赋值给图片控件,可用的扩展方法如下:
public static class StreamExtensions { public static async Task<BitmapImage> ToBitmapImageAsync(this Stream stream) { var bitmap = new BitmapImage(); using (var memStream = new MemoryStream()) { await stream.CopyToAsync(memStream); memStream.Position = 0; bitmap.SetSource(memStream.AsRandomAccessStream()); } return bitmap; } public static async Task<SvgImageSource> ToSvgImageSourceAsync(this Stream stream) { var svgSource = new SvgImageSource(); using (var memStream = new MemoryStream()) { await stream.CopyToAsync(memStream); memStream.Position = 0; await svgSource.SetSourceAsync(memStream.AsRandomAccessStream()); } return svgSource; } }
XAML 直接引用方案说明
原生XAML语法不支持直接引用其他类库中标记为 Embedded Resource 的图片,要实现XAML内直接引用,可选择以下两种方案:
- 调整类库内图片的生成操作:将需要引用的图片生成操作改为
Content,设置复制规则为「如果较新则复制」,确保类库生成的资源文件和主应用输出到同一目录,此时即可用ms-appx:///[类库程序集名]/[资源相对路径]的格式在XAML中直接引用 - 自定义XAML标记扩展:实现一个专门读取嵌入资源的标记扩展,内部封装读取资源流、转换为ImageSource的逻辑,XAML中直接通过该标记扩展赋值Source属性即可,无需额外后台代码。
内容的提问来源于stack exchange,提问作者Dominic Boexler
相关产品推荐
相关产品推荐

