Menu + MenuItem)CheckBox and Radio)ContextMenu Placement and LifecycleMenuFlyout and ContextFlyout PatternsPrimary APIs:
MenuBaseMenuMenuItemContextMenuMenuFlyoutMenuFlyoutPresenterMenuItemToggleTypeHotKeyManagerKeyBinding and KeyGestureImportant members:
MenuBase.IsOpen, MenuBase.Open(), MenuBase.Close(), MenuBase.Opened, MenuBase.ClosedMenuItem.Command, MenuItem.CommandParameter, MenuItem.HotKey, MenuItem.InputGestureMenuItem.IsSubMenuOpen, MenuItem.StaysOpenOnClickMenuItem.ToggleType, MenuItem.IsChecked, MenuItem.GroupNameContextMenu.Placement, PlacementTarget, PlacementRect, PlacementAnchor, PlacementGravityContextMenu.Open(Control?), ContextMenu.Opening, ContextMenu.ClosingMenuFlyout.Items, ItemsSource, ItemTemplate, ItemContainerTheme, FlyoutPresenterThemeReference source files:
src/Avalonia.Controls/MenuBase.cssrc/Avalonia.Controls/Menu.cssrc/Avalonia.Controls/MenuItem.cssrc/Avalonia.Controls/ContextMenu.cssrc/Avalonia.Controls/Flyouts/MenuFlyout.cssrc/Avalonia.Controls/Flyouts/MenuFlyoutPresenter.cssrc/Avalonia.Base/Input/KeyGesture.cssrc/Avalonia.Base/Input/KeyBinding.csUse Menu when:
Use ContextMenu when:
Use MenuFlyout when:
ContextFlyout, explicit ShowAt(...)),MenuItem semantics.Menu + MenuItem)XAML-first top menu with submenus:
<Menu xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<MenuItem Header="_File">
<MenuItem Header="_Open"
Command="{Binding OpenCommand}"
InputGesture="Ctrl+O" />
<MenuItem Header="_Save"
Command="{Binding SaveCommand}"
InputGesture="Ctrl+S" />
<Separator />
<MenuItem Header="E_xit"
Command="{Binding ExitCommand}" />
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem Header="_Copy" Command="{Binding CopyCommand}" InputGesture="Ctrl+C" />
<MenuItem Header="_Paste" Command="{Binding PasteCommand}" InputGesture="Ctrl+V" />
</MenuItem>
</Menu>
Notes:
_ in Header defines access key text.Menu is a MenuBase and manages open/close state across top-level items.InputGesture:
HotKey:
Common pattern:
Command + InputGesture for display,HotKey or root KeyBindings for deterministic behavior.<MenuItem Header="_Save"
Command="{Binding SaveCommand}"
HotKey="Ctrl+S"
InputGesture="Ctrl+S" />
If you centralize shortcuts at view root:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.KeyBindings>
<KeyBinding Gesture="Ctrl+S" Command="{Binding SaveCommand}" />
</UserControl.KeyBindings>
</UserControl>
CheckBox and Radio)MenuItem supports toggled states:
ToggleType="CheckBox" for independent flags,ToggleType="Radio" + GroupName for exclusive choices.<MenuItem xmlns="https://github.com/avaloniaui"
Header="_View">
<MenuItem Header="Show _Grid"
ToggleType="CheckBox"
IsChecked="{Binding ShowGrid}" />
<Separator />
<MenuItem Header="Zoom _100%"
ToggleType="Radio"
GroupName="Zoom"
IsChecked="{Binding Zoom100}" />
<MenuItem Header="Zoom _200%"
ToggleType="Radio"
GroupName="Zoom"
IsChecked="{Binding Zoom200}" />
</MenuItem>
ContextMenu Placement and LifecycleAttached usage:
<Button xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Content="Item Actions">
<Button.ContextMenu>
<ContextMenu Placement="Pointer">
<MenuItem Header="Rename" Command="{Binding RenameCommand}" />
<MenuItem Header="Delete" Command="{Binding DeleteCommand}" />
</ContextMenu>
</Button.ContextMenu>
</Button>
Programmatic open with explicit target:
using Avalonia.Controls;
void ShowMenu(Control target, ContextMenu menu)
{
if (!menu.IsOpen)
menu.Open(target);
}
Lifecycle signals:
Opening allows canceling before opening,Closing allows canceling close,Opened and Closed come from MenuBase routed events.MenuFlyout and ContextFlyout PatternsUse a menu flyout for context-style actions without directly attaching ContextMenu:
<Button xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Content="More">
<Button.ContextFlyout>
<MenuFlyout>
<MenuItem Header="Refresh" Command="{Binding RefreshCommand}" />
<MenuItem Header="Duplicate" Command="{Binding DuplicateCommand}" />
<Separator />
<MenuItem Header="Archive" Command="{Binding ArchiveCommand}" />
</MenuFlyout>
</Button.ContextFlyout>
</Button>
Key behaviors:
MenuFlyout creates a MenuFlyoutPresenter inside popup host.FlyoutPresenterTheme and FlyoutPresenterClasses.using Avalonia.Controls;
using Avalonia.Input;
Menu BuildMainMenu(MainWindowViewModel vm)
{
var file = new MenuItem { Header = "_File" };
file.Items.Add(new MenuItem
{
Header = "_Open",
Command = vm.OpenCommand,
InputGesture = KeyGesture.Parse("Ctrl+O")
});
file.Items.Add(new MenuItem
{
Header = "_Save",
Command = vm.SaveCommand,
HotKey = KeyGesture.Parse("Ctrl+S"),
InputGesture = KeyGesture.Parse("Ctrl+S")
});
file.Items.Add(new Separator());
file.Items.Add(new MenuItem { Header = "E_xit", Command = vm.ExitCommand });
return new Menu { Items = { file } };
}
InputGesture for visible hints, but wire real execution through HotKey or KeyBindings.ContextMenu for target-specific operations and Menu for global app actions.MenuFlyout when you need flyout lifecycle/placement behavior with menu semantics.InputGesture is display-only; register HotKey or a KeyBinding.Open(control) uses an attached control and check PlacementTarget overrides.ToggleType="Radio" and consistent GroupName values.StaysOpenOnClick and command handlers that keep focus in popup.KeyBinding/HotKey registrations across parent and child scopes.