diff --git a/src/Windows/Avalonia.Win32/TrayIconImpl.cs b/src/Windows/Avalonia.Win32/TrayIconImpl.cs index fdb6327a85..67130d1e4f 100644 --- a/src/Windows/Avalonia.Win32/TrayIconImpl.cs +++ b/src/Windows/Avalonia.Win32/TrayIconImpl.cs @@ -274,10 +274,11 @@ namespace Avalonia.Win32 private class TrayPopupRoot : Window { private readonly ManagedPopupPositioner _positioner; - + private readonly TrayIconManagedPopupPositionerPopupImplHelper _positionerHelper; public TrayPopupRoot() { - _positioner = new ManagedPopupPositioner(new TrayIconManagedPopupPositionerPopupImplHelper(MoveResize)); + _positionerHelper = new TrayIconManagedPopupPositionerPopupImplHelper(MoveResize); + _positioner = new ManagedPopupPositioner(_positionerHelper); Topmost = true; Deactivated += TrayPopupRoot_Deactivated; @@ -292,6 +293,12 @@ namespace Avalonia.Win32 Close(); } + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + _positionerHelper.Dispose(); + } + private void MoveResize(PixelPoint position, Size size, double scaling) { if (PlatformImpl is { } platformImpl) @@ -315,7 +322,7 @@ namespace Avalonia.Win32 }); } - private class TrayIconManagedPopupPositionerPopupImplHelper : IManagedPopupPositionerPopup + private class TrayIconManagedPopupPositionerPopupImplHelper : IManagedPopupPositionerPopup, IDisposable { private readonly Action _moveResize; private readonly Window _hiddenWindow; @@ -350,6 +357,11 @@ namespace Avalonia.Win32 _moveResize(new PixelPoint((int)devicePoint.X, (int)devicePoint.Y), virtualSize, Scaling); } + public void Dispose() + { + _hiddenWindow.Close(); + } + public double Scaling => _hiddenWindow.Screens.Primary?.Scaling ?? 1.0; } }