Zum Inhalt
Kuonen.UI

MaskedTextBox

Eingabe mit Maske wie WinForms: 0 Ziffer, 9 Ziffer oder leer, L Buchstabe, > Grossschreibung; Literale werden übersprungen. Falsche Zeichen meldet MaskInputRejected (Stelle und Grund). Einfg schaltet auf Überschreiben, Einfügen geht Zeichen für Zeichen; TextMaskFormat bestimmt den Text.

Vorführung: MaskedTextBoxVorführung: MaskedTextBox

KXAML

MaskedTextBoxSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            xmlns:local="using:Kuonen.UI.Galerie.Seiten"
            x:Class="Kuonen.UI.Galerie.Seiten.MaskedTextBoxVorfuehrung"
            Spacing="8">
  <TextBlock Text="Telefonnummer" FontWeight="SemiBold" />
  <MaskedTextBox x:Name="Telefon" Mask="000 000 00 00" Width="220" HorizontalAlignment="Left" MaskInputRejected="Feld_MaskInputRejected" TextChanged="Feld_TextChanged" />
  <TextBlock Text="AHV-Nummer" FontWeight="SemiBold" />
  <MaskedTextBox x:Name="Ahv" Mask="756.0000.0000.00" Width="220" HorizontalAlignment="Left" MaskInputRejected="Feld_MaskInputRejected" TextChanged="Feld_TextChanged" />
  <TextBlock Text="Postleitzahl" FontWeight="SemiBold" />
  <MaskedTextBox x:Name="Plz" Mask="0000" Width="220" HorizontalAlignment="Left" MaskInputRejected="Feld_MaskInputRejected" TextChanged="Feld_TextChanged" />
  <TextBlock Text="Datum" FontWeight="SemiBold" />
  <MaskedTextBox x:Name="Datum" Mask="00.00.0000" Width="220" HorizontalAlignment="Left" MaskInputRejected="Feld_MaskInputRejected" TextChanged="Feld_TextChanged" />
  <TextBlock Text="Kennzeichen" FontWeight="SemiBold" />
  <!-- > schreibt die Buchstaben gross. -->
  <MaskedTextBox x:Name="Kennzeichen" Mask="&gt;LL 000000" Width="220" HorizontalAlignment="Left" MaskInputRejected="Feld_MaskInputRejected" TextChanged="Feld_TextChanged" />
  <TextBlock Text="Format des Texts" FontWeight="SemiBold" />
  <ComboBox x:Name="Format" Width="220" HorizontalAlignment="Left" ItemsSource="{x:Static local:MaskedTextBoxVorfuehrung.Formate}" SelectedIndex="0" SelectionChanged="Format_SelectionChanged" />
  <ToggleSwitch OffContent="Einfügen" OnContent="Überschreiben" Checked="Ueberschreiben_Checked" Unchecked="Ueberschreiben_Unchecked" />
  <TextBlock x:Name="Meldung" Text="Abgelehnt: –" />
  <TextBlock x:Name="Stand" Text="Text: –" />
</StackPanel>
MaskedTextBoxSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Ereignisse;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der MaskedTextBox-Seite: der Baum steht in MaskedTextBoxSeite.kxaml, hier nur das Verhalten.</summary>
public sealed partial class MaskedTextBoxVorfuehrung
{
    /// <summary>Die Einträge der Formatwahl (gleiche Reihenfolge wie <see cref="MaskedTextBoxSeite.Formatwerte"/>).</summary>
    public static readonly string[] Formate = ["Mit Literalen", "Mit Prompt", "Mit Prompt und Literalen", "Nur Eingaben"];

    public MaskedTextBoxVorfuehrung() => InitializeComponent();

    private MaskedTextBox[] Felder => [Telefon, Ahv, Plz, Datum, Kennzeichen];

    private void Feld_MaskInputRejected(object? sender, MaskInputRejectedEventArgs e) => Meldung.Text = MaskedTextBoxSeite.Abgelehnt(e);

    private void Feld_TextChanged(object sender, RoutedEventArgs e)
    {
        if (sender is MaskedTextBox feld) Stand.Text = MaskedTextBoxSeite.Stand(feld);
    }

    private void Format_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        foreach (var f in Felder) f.TextMaskFormat = MaskedTextBoxSeite.Formatwerte[Math.Max(0, Format.SelectedIndex)];
    }

    private void Ueberschreiben_Checked(object sender, RoutedEventArgs e)
    {
        foreach (var f in Felder) f.InsertKeyMode = InsertKeyMode.Overwrite;
    }

    private void Ueberschreiben_Unchecked(object sender, RoutedEventArgs e)
    {
        foreach (var f in Felder) f.InsertKeyMode = InsertKeyMode.Default;
    }
}

C#

MaskedTextBoxSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;

namespace Kuonen.UI.Galerie.Seiten;

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

    public override string Beschreibung =>
        "Eingabe mit Maske wie WinForms: 0 Ziffer, 9 Ziffer oder leer, L Buchstabe, > Grossschreibung; Literale werden übersprungen. Falsche Zeichen meldet "
        + "MaskInputRejected (Stelle und Grund). Einfg schaltet auf Überschreiben, Einfügen geht Zeichen für Zeichen; TextMaskFormat bestimmt den Text.";

    public override string Stichworte => "Maske Eingabemaske Telefon AHV Postleitzahl Datum Kennzeichen MaskedTextBox Mask PromptChar MaskInputRejected TextMaskFormat Überschreiben";

    public override string Datei => nameof(MaskedTextBoxSeite);

    /// <summary>Die Formate in der Reihenfolge der Auswahlliste.</summary>
    internal static readonly MaskFormat[] Formatwerte = [MaskFormat.IncludeLiterals, MaskFormat.IncludePrompt, MaskFormat.IncludePromptAndLiterals, MaskFormat.ExcludePromptAndLiterals];

    internal static string Stand(MaskedTextBox feld) => $"Text: „{feld.Text}“, vollständig: {(feld.MaskCompleted ? "ja" : "nein")}";

    internal static string Abgelehnt(MaskInputRejectedEventArgs e) => $"Abgelehnt an Stelle {e.Position}: {e.RejectionHint}";

    public override UIElement Baue()
    {
        var seite = new StackPanel { Spacing = 8 };
        var meldung = new TextBlock { Text = "Abgelehnt: –" };
        var stand = new TextBlock { Text = "Text: –" };
        var felder = new List<MaskedTextBox>();
        void Feld(string titel, string maske)
        {
            var feld = new MaskedTextBox { Mask = maske, Width = 220, HorizontalAlignment = HorizontalAlignment.Left };
            feld.MaskInputRejected += (_, e) => meldung.Text = Abgelehnt(e);
            feld.TextChanged += (_, _) => stand.Text = Stand(feld);
            felder.Add(feld);
            seite.Children.Add(new TextBlock { Text = titel, FontWeight = 600 });
            seite.Children.Add(feld);
        }
        Feld("Telefonnummer", "000 000 00 00");
        Feld("AHV-Nummer", "756.0000.0000.00");
        Feld("Postleitzahl", "0000");
        Feld("Datum", "00.00.0000");
        Feld("Kennzeichen", ">LL 000000");
        var format = new ComboBox { Width = 220, HorizontalAlignment = HorizontalAlignment.Left, ItemsSource = MaskedTextBoxVorfuehrung.Formate, SelectedIndex = 0 };
        format.SelectionChanged += (_, _) =>
        {
            foreach (var f in felder) f.TextMaskFormat = Formatwerte[Math.Max(0, format.SelectedIndex)];
        };
        var ueberschreiben = new ToggleSwitch { OffContent = "Einfügen", OnContent = "Überschreiben" };
        ueberschreiben.Checked += (_, _) => { foreach (var f in felder) f.InsertKeyMode = InsertKeyMode.Overwrite; };
        ueberschreiben.Unchecked += (_, _) => { foreach (var f in felder) f.InsertKeyMode = InsertKeyMode.Default; };
        seite.Children.Add(new TextBlock { Text = "Format des Texts", FontWeight = 600 });
        seite.Children.Add(format);
        seite.Children.Add(ueberschreiben);
        seite.Children.Add(meldung);
        seite.Children.Add(stand);
        return seite;
    }
}