ApplicationPrimary APIs:
TrayIconTrayIconsTrayIcon.IconsProperty (attached on Application)TrayIcon.ToolTipTextPropertyTrayIcon.IsVisiblePropertyTrayIcon.IconTrayIcon.ToolTipTextTrayIcon.IsVisibleTrayIcon.MenuTrayIcon.Command, TrayIcon.CommandParameter, TrayIcon.ClickedTrayIcon.NativeMenuExporterMacOSProperties.IsTemplateIconMacOSProperties.IsTemplateIconPropertyMacOSProperties.SetIsTemplateIcon(...), MacOSProperties.GetIsTemplateIcon(...)INativeMenuExporterITrayIconWithIsTemplateImplRelated menu/platform APIs:
NativeMenuNativeMenuItemNativeMenuItemSeparatorINativeMenuExporterProviderPlatformManager.CreateTrayIcon() (platform factory; do not call from normal app code)Reference source files:
src/Avalonia.Controls/TrayIcon.cssrc/Avalonia.Controls/Platform/MacOSProperties.cssrc/Avalonia.Controls/Platform/ITopLevelNativeMenuExporter.cssrc/Avalonia.Controls/Platform/ITrayIconImpl.csKey behavior:
Application via attached property TrayIcon.Icons.TrayIcon binds to a platform tray implementation.Important detail:
TrayIcon.Clicked is platform-dependent; the source comment notes this event is not raised on macOS.NativeMenu attached to TrayIcon.Menu.ApplicationDeclare tray icons directly in App.axaml:
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp"
x:Class="MyApp.App"
x:DataType="vm:App">
<Application.Styles>
<FluentTheme />
</Application.Styles>
<TrayIcon.Icons>
<TrayIcons>
<TrayIcon Icon="/Assets/app.ico"
ToolTipText="MyApp"
Command="{Binding ActivateFromTrayCommand}"
CommandParameter="open-main-window"
MacOSProperties.IsTemplateIcon="True">
<TrayIcon.Menu>
<NativeMenu>
<NativeMenuItem Header="Open" Command="{Binding OpenCommand}" />
<NativeMenuItem Header="Pause Sync"
ToggleType="CheckBox"
IsChecked="{Binding IsSyncPaused}" />
<NativeMenuItemSeparator />
<NativeMenuItem Header="Exit" Command="{Binding ExitCommand}" />
</NativeMenu>
</TrayIcon.Menu>
</TrayIcon>
</TrayIcons>
</TrayIcon.Icons>
</Application>
Notes:
Icon uses WindowIcon conversion from resource URI/file.MacOSProperties.IsTemplateIcon is useful for monochrome template icons in macOS menu bar.using System.Linq;
using Avalonia;
using Avalonia.Controls;
public static class TrayIconHelpers
{
public static TrayIcon? GetPrimaryTrayIcon()
{
var app = Application.Current;
if (app is null)
return null;
return TrayIcon.GetIcons(app)?.FirstOrDefault();
}
public static void ToggleTrayIconVisibility()
{
var icon = GetPrimaryTrayIcon();
if (icon is null)
return;
icon.IsVisible = !icon.IsVisible;
}
public static void UpdateTooltip(string text)
{
var icon = GetPrimaryTrayIcon();
if (icon is null)
return;
icon.ToolTipText = text;
}
}
Manual creation (code-only):
using Avalonia;
using Avalonia.Controls;
var tray = new TrayIcon
{
Icon = new WindowIcon("Assets/app.ico"),
ToolTipText = "MyApp",
IsVisible = true,
Menu = new NativeMenu
{
new NativeMenuItem("Open") { Command = viewModel.OpenCommand },
new NativeMenuItemSeparator(),
new NativeMenuItem("Exit") { Command = viewModel.ExitCommand }
}
};
var icons = new TrayIcons { tray };
TrayIcon.SetIcons(Application.Current!, icons);
TrayIcon.Menu uses NativeMenu APIs:
ToggleType, IsChecked),Command, CommandParameter),IsVisible, IsEnabled).For dynamic tray menus, update menu items in response to state changes before user interaction, similar to native menu guidance in:
MacOSProperties.IsTemplateIcon="True" when needed.Clicked event may not be raised; rely on menu commands.Application scope, not per-window.NativeMenu for predictable cross-platform tray menus.TrayIcon.Icons is set on Application (not Window).Clicked; use tray menu commands instead.TrayIcon.Menu is a NativeMenu with items.Icon with a valid WindowIcon and confirm platform icon format support.