PasswordBox
Ein Kennwortfeld: zeigt Ersatzzeichen statt des Texts, kopiert nicht in die Zwischenablage, führt kein Rückgängig-Protokoll und lässt keine IME zu. Freigewordene Zeichen werden im Speicher sofort überschrieben.


KXAML
PasswordBoxSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
xmlns:x="https://ui.kuonen.org/kxaml/x"
x:Class="Kuonen.UI.Galerie.Seiten.PasswordBoxVorfuehrung"
Spacing="8">
<TextBlock Text="Kennwort" FontWeight="SemiBold" />
<PasswordBox x:Name="Kennwort" Width="280" HorizontalAlignment="Left" PasswordChanged="Kennwort_PasswordChanged" />
<TextBlock x:Name="Staerke" Text="Noch leer." />
<TextBlock Text="Mit * als Ersatzzeichen" FontWeight="SemiBold" />
<!-- Eigenes Ersatzzeichen und Leeren. -->
<StackPanel Orientation="Horizontal" Spacing="8">
<PasswordBox x:Name="Stern" PasswordChar="*" Password="geheim" Width="280" HorizontalAlignment="Left" />
<Button Content="Leeren" Click="Leeren_Click" />
</StackPanel>
<PasswordBox Password="aus" IsEnabled="False" Width="280" HorizontalAlignment="Left" />
</StackPanel>PasswordBoxSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Ereignisse;
namespace Kuonen.UI.Galerie.Seiten;
public sealed partial class PasswordBoxSeite
{
protected override Func<UIElement>? KxamlFabrik => () => new PasswordBoxVorfuehrung();
}
/// <summary>KXAML-Fassung der PasswordBox-Seite: der Baum steht in PasswordBoxSeite.kxaml, hier nur das Verhalten.</summary>
public sealed partial class PasswordBoxVorfuehrung
{
public PasswordBoxVorfuehrung() => InitializeComponent();
private void Kennwort_PasswordChanged(object sender, RoutedEventArgs e) => Staerke.Text = Kennwort.PasswordLength switch
{
0 => "Noch leer.",
< 8 => $"{Kennwort.PasswordLength} Zeichen – zu kurz.",
_ => $"{Kennwort.PasswordLength} Zeichen – lang genug.",
};
private void Leeren_Click(object sender, RoutedEventArgs e) => Stern.Clear();
}C#
PasswordBoxSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
namespace Kuonen.UI.Galerie.Seiten;
/// <summary>Galerie-Seite: <see cref="PasswordBox"/>.</summary>
public sealed partial class PasswordBoxSeite : GalerieSeite
{
public override string Titel => "PasswordBox";
public override string Beschreibung =>
"Ein Kennwortfeld: zeigt Ersatzzeichen statt des Texts, kopiert nicht in die Zwischenablage, führt kein "
+ "Rückgängig-Protokoll und lässt keine IME zu. Freigewordene Zeichen werden im Speicher sofort überschrieben.";
public override string Stichworte => "Kennwort Passwort Kennwortfeld verdeckt PasswordChar PasswordChanged geheim";
public override string Datei => nameof(PasswordBoxSeite);
public override UIElement Baue()
{
var kennwort = new PasswordBox { Width = 280, HorizontalAlignment = HorizontalAlignment.Left };
var staerke = new TextBlock { Text = "Noch leer." };
kennwort.PasswordChanged += (_, _) => staerke.Text = kennwort.PasswordLength switch
{
0 => "Noch leer.",
< 8 => $"{kennwort.PasswordLength} Zeichen – zu kurz.",
_ => $"{kennwort.PasswordLength} Zeichen – lang genug.",
};
// Eigenes Ersatzzeichen und Leeren.
var stern = new PasswordBox { PasswordChar = '*', Password = "geheim", Width = 280, HorizontalAlignment = HorizontalAlignment.Left };
var leeren = new Button { Content = "Leeren" };
leeren.Click += (_, _) => stern.Clear();
var reihe = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 8 };
reihe.Children.Add(stern);
reihe.Children.Add(leeren);
var seite = new StackPanel { Spacing = 8 };
seite.Children.Add(new TextBlock { Text = "Kennwort", FontWeight = 600 });
seite.Children.Add(kennwort);
seite.Children.Add(staerke);
seite.Children.Add(new TextBlock { Text = "Mit * als Ersatzzeichen", FontWeight = 600 });
seite.Children.Add(reihe);
seite.Children.Add(new PasswordBox { Password = "aus", IsEnabled = false, Width = 280, HorizontalAlignment = HorizontalAlignment.Left });
return seite;
}
}