Zum Inhalt
Kuonen.UI

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.

Vorführung: Menu und ContextMenuVorführung: Menu und ContextMenu

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;
    }
}