Zum Inhalt
Kuonen.UI

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.

Vorführung: PasswordBoxVorführung: PasswordBox

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