如何将WPF的BitmapSource转换为WinUI 3的BitmapSource?
WinUI3中Shell缩略图的转换方案
你当前用WPF兼容的Shell API获取到的BitmapSource无法直接在WinUI3中使用,以下是两种简便的转换方法:
流转换法(简单通用)
把WPF的BitmapSource转成内存流,再加载为WinUI3的BitmapImage:
using System.IO; using System.Windows.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging; // 你的原有代码获取到的WPF BitmapSource var wpfBitmap = result; var winuiBitmap = new BitmapImage(); using (var stream = new MemoryStream()) { var encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(wpfBitmap)); encoder.Save(stream); stream.Position = 0; winuiBitmap.SetSource(stream.AsRandomAccessStream()); } // winuiBitmap可直接绑定到WinUI3的Image控件
像素直接复制法(高性能)
如果对性能要求高,直接复制像素数据到WinUI3的WriteableBitmap:
using System.Windows.Media; using Microsoft.UI.Xaml.Media.Imaging; var wpfBitmap = result; var winuiBitmap = new WriteableBitmap( (int)wpfBitmap.PixelWidth, (int)wpfBitmap.PixelHeight); wpfBitmap.CopyPixels( new Int32Rect(0, 0, (int)wpfBitmap.PixelWidth, (int)wpfBitmap.PixelHeight), winuiBitmap.PixelBuffer, winuiBitmap.PixelWidth * 4, 0); winuiBitmap.Invalidate();
注意事项
- 缩略图获取操作建议放在后台线程执行,避免阻塞UI,转换完成后再切换到UI线程赋值。
- 频繁获取时记得加缓存,减少重复转换和Shell API调用开销。
内容的提问来源于stack exchange,提问作者David Hitchen
相关产品推荐
相关产品推荐

