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.


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