在WPF中设置图标作为图像控制源的正确方法

本文关键字:控制 方法 图像 WPF 设置 图标 | 更新日期: 2023-09-27 17:50:18

我在WPF应用程序中有一个image控件:

<Image x:Name="image" Source="{Binding}"/>

…我正在试图找出哪一种最有效的方式来设置它的来源。我用SystemIcons.WinLogo作为我的测试对象。

第一种方法涉及CreateBitmpapSourceFromHIcon:

image.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
                   SystemIcons.WinLogo.Handle, Int32Rect.Empty, 
                   System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

第二种方法使用BitmapImage并从内存流设置其源:

var ms = new MemoryStream();
SystemIcons.WinLogo.ToBitmap().Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Position = 0;
var bmpi = new BitmapImage();
bmpi.BeginInit();
bmpi.StreamSource = ms;
bmpi.EndInit();
image.Source = bmpi;

我应该用哪一个?

在WPF中设置图标作为图像控制源的正确方法

两者的目的相同。如果你问我,我会选择第一种方法,因为这是直接的,不需要得到图标首先保存在内存流。

但是,如果您想使用第二种方法,请确保在bitmapImage实例上调用Freeze(),以避免任何内存泄漏。冻结它也会使它线程安全,也就是说,你可以在后台线程中创建bitmapImage,并且仍然可以在UI线程中设置为图像源。

var bmpi = new BitmapImage();
bmpi.BeginInit();
bmpi.StreamSource = ms;
bmpi.EndInit();
bmpi.Freeze(); <-- HERE
image.Source = bmpi;