Menu und ContextMenu
Die Menüleiste öffnet Untermenüs beim Klick und beim Überfahren, wenn schon eins offen ist. Alt oder F10 aktivieren sie, Alt mit dem Buchstaben nach dem Unterstrich (_) öffnet ein Menü. Einträge haben ein Kürzel, einen Haken oder ein Untermenü. Das Kontextmenü öffnet die rechte Maustaste, die Menütaste oder Umschalt+F10.


KXAML
MenuSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
xmlns:x="https://ui.kuonen.org/kxaml/x"
x:Class="Kuonen.UI.Galerie.Seiten.MenuVorfuehrung"
Spacing="16">
<!-- Menü: Einträge mit Zugriffstaste (_) und Kürzeltext, Untermenü, Trenner, abhakbar, deaktiviert. -->
<Menu>
<MenuItem Header="_Datei">
<MenuItem Header="_Neu" InputGestureText="Strg+N" Click="Eintrag_Click" />
<MenuItem Header="_Öffnen" InputGestureText="Strg+O" Click="Eintrag_Click" />
<MenuItem Header="_Zuletzt geöffnet">
<MenuItem Header="Dokument 1" InputGestureText="" Click="Eintrag_Click" />
<MenuItem Header="Dokument 2" InputGestureText="" Click="Eintrag_Click" />
<MenuItem Header="Dokument 3" InputGestureText="" Click="Eintrag_Click" />
</MenuItem>
<Separator />
<MenuItem Header="_Beenden" InputGestureText="Alt+F4" Click="Eintrag_Click" />
</MenuItem>
<MenuItem Header="_Ansicht">
<MenuItem x:Name="Leiste" Header="_Statusleiste" IsCheckable="True" IsChecked="True" Click="Leiste_Click" />
<MenuItem Header="_Nicht verfügbar" IsEnabled="False" />
</MenuItem>
</Menu>
<!-- Ein Kontextmenü an einem Ziel: rechte Maustaste, Menütaste oder Umschalt+F10 öffnen es. -->
<Border Width="260" Height="80" BorderThickness="1" Focusable="True">
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="{DynamicResource Fluent.Farben.RandStark}" />
</Style>
</Border.Style>
<ContextMenuService.ContextMenu>
<ContextMenu>
<MenuItem Header="_Kopieren" InputGestureText="Strg+C" Click="Eintrag_Click" />
<MenuItem Header="_Einfügen" InputGestureText="Strg+V" Click="Eintrag_Click" />
<Separator />
<MenuItem Header="_Löschen" IsEnabled="False" />
</ContextMenu>
</ContextMenuService.ContextMenu>
<TextBlock Text="Rechte Maustaste oder Menütaste" Margin="12" />
</Border>
<TextBlock x:Name="Meldung" Text="Noch nichts gewählt." />
</StackPanel>MenuSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;
namespace Kuonen.UI.Galerie.Seiten;
public sealed partial class MenuSeite
{
protected override Func<UIElement>? KxamlFabrik => () => new MenuVorfuehrung();
}
/// <summary>KXAML-Fassung der Menü-Seite: der Baum steht in MenuSeite.kxaml, hier nur das Verhalten.</summary>
public sealed partial class MenuVorfuehrung
{
public MenuVorfuehrung() => InitializeComponent();
private void Eintrag_Click(object sender, RoutedEventArgs e) =>
Meldung.Text = $"Gewählt: {((string?)((MenuItem)sender).Header)?.Replace("_", "")}.";
private void Leiste_Click(object sender, RoutedEventArgs e) => Meldung.Text = Leiste.IsChecked ? "Statusleiste an." : "Statusleiste aus.";
}C#
MenuSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
using Kuonen.UI.Themes;
namespace Kuonen.UI.Galerie.Seiten;
/// <summary>Galerie-Seite: <see cref="Menu"/> und <see cref="ContextMenu"/>.</summary>
public sealed partial class MenuSeite : GalerieSeite
{
public override string Titel => "Menu und ContextMenu";
public override string Beschreibung =>
"Die Menüleiste öffnet Untermenüs beim Klick und beim Überfahren, wenn schon eins offen ist. Alt oder F10 "
+ "aktivieren sie, Alt mit dem Buchstaben nach dem Unterstrich (_) öffnet ein Menü. Einträge haben ein Kürzel, "
+ "einen Haken oder ein Untermenü. Das Kontextmenü öffnet die rechte Maustaste, die Menütaste oder Umschalt+F10.";
public override string Stichworte => "Menü Menüleiste MenuItem Kontextmenü Separator InputGestureText IsCheckable Untermenü Zugriffstaste Alt";
public override string Datei => nameof(MenuSeite);
public override UIElement Baue()
{
var meldung = new TextBlock { Text = "Noch nichts gewählt." };
MenuItem Eintrag(string kopf, string? kuerzel = null)
{
var eintrag = new MenuItem { Header = kopf, InputGestureText = kuerzel ?? "" };
eintrag.Click += (_, _) => meldung.Text = $"Gewählt: {kopf.Replace("_", "")}.";
return eintrag;
}
var datei = new MenuItem { Header = "_Datei" };
datei.Items.Add(Eintrag("_Neu", "Strg+N"));
datei.Items.Add(Eintrag("_Öffnen", "Strg+O"));
var zuletzt = new MenuItem { Header = "_Zuletzt geöffnet" };
for (int i = 1; i <= 3; i++) zuletzt.Items.Add(Eintrag($"Dokument {i}"));
datei.Items.Add(zuletzt);
datei.Items.Add(new Separator());
datei.Items.Add(Eintrag("_Beenden", "Alt+F4"));
var ansicht = new MenuItem { Header = "_Ansicht" };
var leiste = new MenuItem { Header = "_Statusleiste", IsCheckable = true, IsChecked = true };
leiste.Click += (_, _) => meldung.Text = leiste.IsChecked ? "Statusleiste an." : "Statusleiste aus.";
ansicht.Items.Add(leiste);
ansicht.Items.Add(new MenuItem { Header = "_Nicht verfügbar", IsEnabled = false });
var menue = new Menu();
menue.Items.Add(datei);
menue.Items.Add(ansicht);
// Ein Kontextmenü an einem Ziel: rechte Maustaste, Menütaste oder Umschalt+F10 öffnen es.
var kontext = new ContextMenu();
kontext.Items.Add(Eintrag("_Kopieren", "Strg+C"));
kontext.Items.Add(Eintrag("_Einfügen", "Strg+V"));
kontext.Items.Add(new Separator());
kontext.Items.Add(new MenuItem { Header = "_Löschen", IsEnabled = false });
var ziel = new Border
{
Width = 260, Height = 80, BorderThickness = new Thickness(1), Focusable = true,
Style = new Style(typeof(Border)).Setze(Border.BorderBrushProperty, Fluent.Farben.RandStark),
Child = new TextBlock { Text = "Rechte Maustaste oder Menütaste", Margin = new Thickness(12) },
};
ContextMenuService.SetContextMenu(ziel, kontext);
var seite = new StackPanel { Spacing = 16 };
seite.Children.Add(menue);
seite.Children.Add(ziel);
seite.Children.Add(meldung);
return seite;
}
}