Zum Inhalt
Kuonen.UI

Tastenkürzel

Tastenkürzel hängen als KeyBinding an einem Element (InputBindings). Eine Taste, die kein Control selbst behandelt, steigt vom Fokus auf; die nächste passende Bindung mit ausführbarem Befehl führt aus. Gesten liest KeyGesture aus Text wie „Ctrl+S“ und zeigt sie je Plattform („Strg+S“, auf macOS „⌘S“).

Vorführung: TastenkürzelVorführung: Tastenkürzel

KXAML

TastenkuerzelSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.TastenkuerzelVorfuehrung"
            Spacing="12">
  <StackPanel.InputBindings>
    <!-- Die Befehle setzt das Code-Behind. -->
    <KeyBinding x:Name="Speichern" Gesture="Ctrl+S" />
    <KeyBinding x:Name="Aktualisieren" Gesture="F5" />
    <KeyBinding x:Name="Neu" Gesture="Ctrl+Shift+N" />
  </StackPanel.InputBindings>
  <TextBlock Text="Strg+S speichert, F5 aktualisiert, Strg+Umschalt+N legt neu an. Der Fokus darf im Textfeld liegen." TextWrapping="Wrap" />
  <TextBox Width="240" HorizontalAlignment="Left" PlaceholderText="Hier tippen" />
  <TextBlock x:Name="Meldung" Text="Noch kein Kürzel gedrückt." />
</StackPanel>
TastenkuerzelSeite.kxaml.cs
using Kuonen.UI;

namespace Kuonen.UI.Galerie.Seiten;

public sealed partial class TastenkuerzelSeite
{
    protected override Func<UIElement>? KxamlFabrik => () => new TastenkuerzelVorfuehrung();
}

/// <summary>KXAML-Fassung der Seite Tastenkürzel: der Baum und die Gesten stehen in TastenkuerzelSeite.kxaml, hier die Befehle.</summary>
public sealed partial class TastenkuerzelVorfuehrung
{
    public TastenkuerzelVorfuehrung()
    {
        InitializeComponent();
        Speichern.Command = TastenkuerzelSeite.Befehl(Meldung, "Gespeichert (Strg+S).");
        Aktualisieren.Command = TastenkuerzelSeite.Befehl(Meldung, "Aktualisiert (F5).");
        Neu.Command = TastenkuerzelSeite.Befehl(Meldung, "Neu angelegt (Strg+Umschalt+N).");
    }
}

C#

TastenkuerzelSeite.cs
using System.Windows.Input;
using Kuonen.UI;
using Kuonen.UI.Befehle;
using Kuonen.UI.Controls;
using Kuonen.UI.Eingabe;
using Kuonen.UI.Layout;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: Tastenkürzel mit <see cref="KeyBinding"/> und <see cref="UIElement.InputBindings"/>.</summary>
public sealed partial class TastenkuerzelSeite : GalerieSeite
{
    public override string Titel => "Tastenkürzel";

    public override string Beschreibung =>
        "Tastenkürzel hängen als KeyBinding an einem Element (InputBindings). Eine Taste, die kein Control selbst behandelt, steigt vom Fokus auf; die "
        + "nächste passende Bindung mit ausführbarem Befehl führt aus. Gesten liest KeyGesture aus Text wie „Ctrl+S“ und zeigt sie je Plattform "
        + "(„Strg+S“, auf macOS „⌘S“).";

    public override string Stichworte => "Tastenkürzel Kürzel Shortcut KeyBinding KeyGesture InputBindings Befehl Command Strg F5 Accelerator";

    public override string Datei => nameof(TastenkuerzelSeite);

    /// <summary>Ein Befehl, der die Meldung setzt.</summary>
    internal static ICommand Befehl(TextBlock meldung, string text) => new RelayCommand(() => meldung.Text = text);

    public override UIElement Baue()
    {
        var meldung = new TextBlock { Text = "Noch kein Kürzel gedrückt." };
        var seite = new StackPanel { Spacing = 12 };
        seite.Children.Add(new TextBlock
        {
            Text = "Strg+S speichert, F5 aktualisiert, Strg+Umschalt+N legt neu an. Der Fokus darf im Textfeld liegen.",
            TextWrapping = TextWrapping.Wrap,
        });
        seite.Children.Add(new TextBox { Width = 240, HorizontalAlignment = HorizontalAlignment.Left, PlaceholderText = "Hier tippen" });
        seite.Children.Add(meldung);
        seite.InputBindings.Add(new KeyBinding(Befehl(meldung, "Gespeichert (Strg+S)."), KeyGesture.Parse("Ctrl+S")));
        seite.InputBindings.Add(new KeyBinding(Befehl(meldung, "Aktualisiert (F5)."), KeyGesture.Parse("F5")));
        seite.InputBindings.Add(new KeyBinding(Befehl(meldung, "Neu angelegt (Strg+Umschalt+N)."), KeyGesture.Parse("Ctrl+Shift+N")));
        return seite;
    }
}