在WPF中将图标设置为图像控制源的正确方法是什么?

时间:2014-03-15 03:37:47

标签: c# wpf

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

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

...而且我正在试图弄清楚哪一个是从图标设置其来源的最有效方式。我使用SystemIcons.WinLogo作为我的测试对象。<​​/ p>

第一种方式涉及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;

我应该使用哪一个?他们都工作,我没有注意到我的系统在性能上有太大差异。

1 个答案:

答案 0 :(得分:1)

两者都有同样的目的。如果你问我,我会采用第一种方法,因为这是直接的,不需要先将图标保存在内存流中。

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

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