Browse Source

implement trayicon lifetime management.

pull/6610/head
Dan Walmsley 5 years ago
parent
commit
f65f08e4be
  1. 2
      src/Avalonia.Controls/Platform/ITrayIconImpl.cs
  2. 21
      src/Avalonia.Controls/TrayIcon.cs
  3. 5
      src/Avalonia.DesignerSupport/Remote/TrayIconStub.cs
  4. 30
      src/Windows/Avalonia.Win32/TrayIconImpl.cs

2
src/Avalonia.Controls/Platform/ITrayIconImpl.cs

@ -6,7 +6,7 @@ using Avalonia.Controls.Platform;
namespace Avalonia.Platform
{
public interface ITrayIconImpl
public interface ITrayIconImpl : IDisposable
{
/// <summary>
/// Sets the icon of this tray icon.

21
src/Avalonia.Controls/TrayIcon.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Avalonia.Collections;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Platform;
using Avalonia.Platform;
@ -12,7 +13,7 @@ namespace Avalonia.Controls
{
}
public class TrayIcon : AvaloniaObject, IDataContextProvider, INativeMenuExporterProvider
public class TrayIcon : AvaloniaObject, IDataContextProvider, INativeMenuExporterProvider, IDisposable
{
private readonly ITrayIconImpl _impl;
@ -44,6 +45,21 @@ namespace Avalonia.Controls
}
}
});
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime)
{
lifetime.Exit += Lifetime_Exit;
}
}
private static void Lifetime_Exit(object sender, ControlledApplicationLifetimeExitEventArgs e)
{
var trayIcons = GetTrayIcons(Application.Current);
foreach(var icon in trayIcons)
{
icon.Dispose();
}
}
private static void Icons_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
@ -84,6 +100,7 @@ namespace Avalonia.Controls
/// </summary>
public static readonly StyledProperty<bool> IsVisibleProperty =
Visual.IsVisibleProperty.AddOwner<TrayIcon>();
private bool _disposedValue;
public static void SetTrayIcons(AvaloniaObject o, TrayIcons trayIcons) => o.SetValue(TrayIconsProperty, trayIcons);
@ -160,5 +177,7 @@ namespace Avalonia.Controls
_impl.SetToolTipText(change.NewValue.GetValueOrDefault<string?>());
}
}
public void Dispose() => _impl.Dispose();
}
}

5
src/Avalonia.DesignerSupport/Remote/TrayIconStub.cs

@ -13,6 +13,11 @@ namespace Avalonia.DesignerSupport.Remote
public INativeMenuExporter MenuExporter => throw new NotImplementedException();
public void Dispose()
{
throw new NotImplementedException();
}
public void SetIcon(IWindowIconImpl icon)
{
}

30
src/Windows/Avalonia.Win32/TrayIconImpl.cs

@ -25,6 +25,7 @@ namespace Avalonia.Win32
private readonly Win32NativeToManagedMenuExporter _exporter;
private static Dictionary<int, TrayIconImpl> s_trayIcons = new Dictionary<int, TrayIconImpl>();
private bool _disposedValue;
public INativeMenuExporter MenuExporter => _exporter;
@ -45,12 +46,6 @@ namespace Avalonia.Win32
s_trayIcons.Add(_uniqueId, this);
}
~TrayIconImpl()
{
UpdateIcon(false);
}
public void SetIcon(IWindowIconImpl? icon)
{
_icon = icon as IconImpl;
@ -258,5 +253,28 @@ namespace Avalonia.Win32
public virtual double Scaling => _hiddenWindow.Screens.Primary.PixelDensity;
}
}
protected virtual void Dispose(bool disposing)
{
if (!_disposedValue)
{
UpdateIcon(true);
_disposedValue = true;
}
}
~TrayIconImpl()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: false);
}
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
}

Loading…
Cancel
Save