diff --git a/src/Windows/Avalonia.Win32/IconImpl.cs b/src/Windows/Avalonia.Win32/IconImpl.cs index bdbf338caf..d5f227d0d9 100644 --- a/src/Windows/Avalonia.Win32/IconImpl.cs +++ b/src/Windows/Avalonia.Win32/IconImpl.cs @@ -1,6 +1,7 @@ using Avalonia.Platform; using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,11 +10,19 @@ namespace Avalonia.Win32 { class IconImpl : IWindowIconImpl { - public IconImpl(System.Drawing.Bitmap iconBitmap) + private Bitmap bitmap; + private Icon icon; + + public IconImpl(Bitmap bitmap) + { + this.bitmap = bitmap; + } + + public IconImpl(Icon icon) { - IconBitmap = iconBitmap; + this.icon = icon; } - public System.Drawing.Bitmap IconBitmap { get; } + public IntPtr HIcon => icon?.Handle ?? bitmap.GetHicon(); } } diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index a7597ffb86..c6971a9f65 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -189,14 +189,15 @@ namespace Avalonia.Win32 public IWindowIconImpl LoadIcon(string fileName) { - var icon = new System.Drawing.Bitmap(fileName); - return new IconImpl(icon); + using (var stream = File.OpenRead(fileName)) + { + return CreateImpl(stream); + } } public IWindowIconImpl LoadIcon(Stream stream) { - var icon = new System.Drawing.Bitmap(stream); - return new IconImpl(icon); + return CreateImpl(stream); } public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) @@ -207,5 +208,17 @@ namespace Avalonia.Win32 return new IconImpl(new System.Drawing.Bitmap(memoryStream)); } } + + private static IconImpl CreateImpl(Stream stream) + { + try + { + return new IconImpl(new System.Drawing.Icon(stream)); + } + catch (ArgumentException) + { + return new IconImpl(new System.Drawing.Bitmap(stream)); + } + } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index af68257357..62fbdda275 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -684,9 +684,9 @@ namespace Avalonia.Win32 public void SetIcon(IWindowIconImpl icon) { var impl = (IconImpl)icon; - var nativeIcon = impl.IconBitmap; + var hIcon = impl.HIcon; UnmanagedMethods.PostMessage(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_SETICON, - new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), nativeIcon.GetHicon()); + new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), hIcon); } private static int ToInt32(IntPtr ptr)