Zum Inhalt
Kuonen.UI

RepeatButton

Eine Schaltfläche, die gedrückt gehalten ihr Click-Ereignis wiederholt: zuerst nach Delay, dann alle Interval Millisekunden. Gut für Zähler und Bildlaufpfeile.

Vorführung: RepeatButtonVorführung: RepeatButton

KXAML

RepeatButtonSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.RepeatButtonVorfuehrung"
            Spacing="12">
  <!-- Standard: 400 ms bis zur ersten Wiederholung, dann alle 50 ms. -->
  <StackPanel Orientation="Horizontal" Spacing="8">
    <RepeatButton Content="−" Width="40" Click="Weniger_Click" />
    <TextBlock x:Name="Anzeige" Text="0" FontSize="20" MinWidth="48" TextAlignment="Mitte" VerticalAlignment="Center" />
    <RepeatButton Content="+" Width="40" Click="Mehr_Click" />
  </StackPanel>
  <!-- Eigene Zeiten: sofort und langsam wiederholen. -->
  <StackPanel Orientation="Horizontal" Spacing="8">
    <RepeatButton Content="+10 (langsam)" Delay="0" Interval="400" Click="Langsam_Click" />
    <Button Content="Auf 0" Click="Zurueck_Click" />
    <RepeatButton Content="Deaktiviert" IsEnabled="False" />
  </StackPanel>
  <TextBlock Text="Gedrückt halten: der Wert läuft weiter, bis die Taste losgelassen wird." TextWrapping="Wrap" />
</StackPanel>
RepeatButtonSeite.kxaml.cs
using System.Globalization;
using Kuonen.UI;
using Kuonen.UI.Ereignisse;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der RepeatButton-Seite: der Baum steht in RepeatButtonSeite.kxaml, hier nur das Verhalten.</summary>
public sealed partial class RepeatButtonVorfuehrung
{
    private int _wert;

    public RepeatButtonVorfuehrung() => InitializeComponent();

    private void Setze(int neu)
    {
        _wert = Math.Clamp(neu, -999, 999);
        Anzeige.Text = _wert.ToString(CultureInfo.InvariantCulture);
    }

    private void Weniger_Click(object sender, RoutedEventArgs e) => Setze(_wert - 1);

    private void Mehr_Click(object sender, RoutedEventArgs e) => Setze(_wert + 1);

    private void Langsam_Click(object sender, RoutedEventArgs e) => Setze(_wert + 10);

    private void Zurueck_Click(object sender, RoutedEventArgs e) => Setze(0);
}

C#

RepeatButtonSeite.cs
using System.Globalization;
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
using Kuonen.UI.Text;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: <see cref="RepeatButton"/>.</summary>
public sealed partial class RepeatButtonSeite : GalerieSeite
{
    public override string Titel => "RepeatButton";

    public override string Beschreibung =>
        "Eine Schaltfläche, die gedrückt gehalten ihr Click-Ereignis wiederholt: zuerst nach Delay, dann alle Interval "
        + "Millisekunden. Gut für Zähler und Bildlaufpfeile.";

    public override string Stichworte => "Wiederholen Wiederholtaste gedrückt halten Delay Interval Zähler";

    public override string Datei => nameof(RepeatButtonSeite);

    public override UIElement Baue()
    {
        int wert = 0;
        var anzeige = new TextBlock { Text = "0", FontSize = 20, MinWidth = 48, TextAlignment = TextAusrichtung.Mitte, VerticalAlignment = VerticalAlignment.Center };
        void Setze(int neu)
        {
            wert = Math.Clamp(neu, -999, 999);
            anzeige.Text = wert.ToString(CultureInfo.InvariantCulture);
        }

        // Standard: 400 ms bis zur ersten Wiederholung, dann alle 50 ms.
        var weniger = new RepeatButton { Content = "−", Width = 40 };
        weniger.Click += (_, _) => Setze(wert - 1);
        var mehr = new RepeatButton { Content = "+", Width = 40 };
        mehr.Click += (_, _) => Setze(wert + 1);
        var zaehler = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8 };
        zaehler.Children.Add(weniger);
        zaehler.Children.Add(anzeige);
        zaehler.Children.Add(mehr);

        // Eigene Zeiten: sofort und langsam wiederholen.
        var langsam = new RepeatButton { Content = "+10 (langsam)", Delay = 0, Interval = 400 };
        langsam.Click += (_, _) => Setze(wert + 10);
        var zurueck = new Button { Content = "Auf 0" };
        zurueck.Click += (_, _) => Setze(0);
        var aus = new RepeatButton { Content = "Deaktiviert", IsEnabled = false };
        var weitere = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8 };
        weitere.Children.Add(langsam);
        weitere.Children.Add(zurueck);
        weitere.Children.Add(aus);

        var seite = new StackPanel { Spacing = 12 };
        seite.Children.Add(zaehler);
        seite.Children.Add(weitere);
        seite.Children.Add(new TextBlock { Text = "Gedrückt halten: der Wert läuft weiter, bis die Taste losgelassen wird.", TextWrapping = TextWrapping.Wrap });
        return seite;
    }
}