From 949b7f2d9427e3922e43721a03f1acc13b209680 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 19 Jul 2022 21:24:29 -0400 Subject: [PATCH 1/4] Call GetHicon only once when creation a windows icon --- src/Windows/Avalonia.Win32/IconImpl.cs | 20 +++----------------- src/Windows/Avalonia.Win32/TrayIconImpl.cs | 4 +++- src/Windows/Avalonia.Win32/Win32Platform.cs | 8 ++++++-- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/Windows/Avalonia.Win32/IconImpl.cs b/src/Windows/Avalonia.Win32/IconImpl.cs index 8548801555..4d2b89b0cc 100644 --- a/src/Windows/Avalonia.Win32/IconImpl.cs +++ b/src/Windows/Avalonia.Win32/IconImpl.cs @@ -1,6 +1,5 @@ using System; using System.Drawing; -using System.Drawing.Imaging; using System.IO; using Avalonia.Platform; @@ -8,31 +7,18 @@ namespace Avalonia.Win32 { class IconImpl : IWindowIconImpl { - private Bitmap bitmap; - private Icon icon; - - public IconImpl(Bitmap bitmap) - { - this.bitmap = bitmap; - } + private readonly Icon icon; public IconImpl(Icon icon) { this.icon = icon; } - public IntPtr HIcon => icon?.Handle ?? bitmap.GetHicon(); + public IntPtr HIcon => icon.Handle; public void Save(Stream outputStream) { - if (icon != null) - { - icon.Save(outputStream); - } - else - { - bitmap.Save(outputStream, ImageFormat.Png); - } + icon.Save(outputStream); } } } diff --git a/src/Windows/Avalonia.Win32/TrayIconImpl.cs b/src/Windows/Avalonia.Win32/TrayIconImpl.cs index 4d537a16a4..346d6e5adb 100644 --- a/src/Windows/Avalonia.Win32/TrayIconImpl.cs +++ b/src/Windows/Avalonia.Win32/TrayIconImpl.cs @@ -18,6 +18,8 @@ namespace Avalonia.Win32 [Unstable] public class TrayIconImpl : ITrayIconImpl { + private static readonly IntPtr s_emptyIcon = new System.Drawing.Bitmap(32, 32).GetHicon(); + private readonly int _uniqueId; private static int s_nextUniqueId; private bool _iconAdded; @@ -86,7 +88,7 @@ namespace Avalonia.Win32 uID = _uniqueId, uFlags = NIF.TIP | NIF.MESSAGE, uCallbackMessage = (int)CustomWindowsMessage.WM_TRAYMOUSE, - hIcon = _icon?.HIcon ?? new IconImpl(new System.Drawing.Bitmap(32, 32)).HIcon, + hIcon = _icon?.HIcon ?? s_emptyIcon, szTip = _tooltipText ?? "" }; diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 73ef50052c..2b8070fb04 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -359,7 +359,7 @@ namespace Avalonia.Win32 using (var memoryStream = new MemoryStream()) { bitmap.Save(memoryStream); - return new IconImpl(new System.Drawing.Bitmap(memoryStream)); + return CreateIconImpl(memoryStream); } } @@ -367,11 +367,15 @@ namespace Avalonia.Win32 { try { + // new Icon() will work only if stream is an "ico" file. return new IconImpl(new System.Drawing.Icon(stream)); } catch (ArgumentException) { - return new IconImpl(new System.Drawing.Bitmap(stream)); + // Fallback to Bitmap creation and converting into a windows icon. + using var icon = new System.Drawing.Bitmap(stream); + var hIcon = icon.GetHicon(); + return new IconImpl(System.Drawing.Icon.FromHandle(hIcon)); } } From 62d1b4f3b69eb97460a0c3bc0999caff8ed16ecb Mon Sep 17 00:00:00 2001 From: Max Katz Date: Tue, 19 Jul 2022 23:25:37 -0400 Subject: [PATCH 2/4] Add missing IsEnabled binding --- src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml | 1 + src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml b/src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml index 81bd8f39c5..3b0019eea1 100644 --- a/src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml +++ b/src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml @@ -14,6 +14,7 @@