Zum Inhalt
Kuonen.UI

NumberBox

Zahlenfeld wie WinUI: leer erlaubt, Rechenausdrücke (2+3*4), Drehknöpfe inline oder kompakt, Grenzen und Umlaufen, Pfeile und Rad.

Vorführung: NumberBoxVorführung: NumberBox

KXAML

NumberBoxSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.NumberBoxVorfuehrung"
            Spacing="8">
  <!-- Gefüllt von NumberBoxSeite.Fuelle, derselben Methode wie die C#-Fassung. -->
  <StackPanel x:Name="Flaeche" Spacing="8" />
</StackPanel>
NumberBoxSeite.kxaml.cs
using Kuonen.UI;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der Seite: das Gerüst steht in NumberBoxSeite.kxaml, das Innere füllt NumberBoxSeite.Fuelle.</summary>
public sealed partial class NumberBoxVorfuehrung
{
    public NumberBoxVorfuehrung()
    {
        InitializeComponent();
        NumberBoxSeite.Fuelle(Flaeche);
    }
}

C#

NumberBoxSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
using Kuonen.UI.Media;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: NumberBox (Plan 6m).</summary>
public sealed partial class NumberBoxSeite : GalerieSeite
{
    public override string Titel => "NumberBox";

    public override string Beschreibung => "Zahlenfeld wie WinUI: leer erlaubt, Rechenausdrücke (2+3*4), Drehknöpfe inline oder kompakt, Grenzen und Umlaufen, Pfeile und Rad.";

    public override string Stichworte => "NumberBox Zahl Ausdruck Rechnen SpinButton Drehknopf WinUI";

    public override string Datei => nameof(NumberBoxSeite);

    public override UIElement Baue()
    {
        // Wie die KXAML-Fassung: eine Wurzel mit der Fläche darin.
        var flaeche = new StackPanel { Spacing = 8 };
        Fuelle(flaeche);
        return new StackPanel { Spacing = 8, Children = { flaeche } };
    }

    private static Button Knopf(string text, Action tun)
    {
        var k = new Button { Content = text };
        k.Click += (_, _) => tun();
        return k;
    }

    private static StackPanel Zeile(params UIElement[] kinder)
    {
        var z = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6 };
        foreach (var k in kinder) z.Children.Add(k);
        return z;
    }

    /// <summary>Inhalt der Seite (auch von der KXAML-Fassung benutzt).</summary>
    public static void Fuelle(StackPanel flaeche)
    {
        var wert = new TextBlock();
        var rechnen = new NumberBox { Header = "Mit Ausdrücken", PlaceholderText = "z. B. 2+3*4", AcceptsExpression = true, Width = 220, HorizontalAlignment = HorizontalAlignment.Left };
        rechnen.ValueChanged += (_, e) => wert.Text = "Wert: " + (double.IsNaN(e.NewValue) ? "leer" : e.NewValue.ToString(System.Globalization.CultureInfo.CurrentCulture));
        var menge = new NumberBox { Header = "Menge (0 bis 10, umlaufend)", Minimum = 0, Maximum = 10, Value = 5, IsWrapEnabled = true, SpinButtonPlacementMode = NumberBoxSpinButtonPlacementMode.Inline, Width = 220, HorizontalAlignment = HorizontalAlignment.Left };
        var kompakt = new NumberBox { Header = "Kompakt", Value = 1.5, SmallChange = 0.5, NumberFormat = "0.0", SpinButtonPlacementMode = NumberBoxSpinButtonPlacementMode.Compact, Width = 220, HorizontalAlignment = HorizontalAlignment.Left };
        flaeche.Children.Add(rechnen);
        flaeche.Children.Add(menge);
        flaeche.Children.Add(kompakt);
        flaeche.Children.Add(wert);
    }
}