Ich hatte heute die kleine Herausforderung das [Password|Text]Box.SelectAll()-Verhalten ordentlich zu implementieren. Bei der Recherche stolperte ich über die Lösung, das ganze über einen Delay innerhalb eines Threads/Tasks zu lösen. Problem dabei: Ich möchte nicht unbedingt einen neuen Task starten, um die Box automatisch alles selektieren zu lassen. Folgendes funktionierte (getestet) nicht:

public class PasswordBoxSelectallBehavior : Behavior<PasswordBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.GotFocus += AssociatedObject_GotFocus;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.GotFocus -= AssociatedObject_GotFocus;
    }

    private void AssociatedObject_GotFocus(object sender, System.Windows.RoutedEventArgs e) => AssociatedObject.SelectAll());
}

Nach der Recherche und dem Microsoft Support-Forum-Thread habe ich zu Versuchszwecken einfach den Dispatcher die Aktion ausführen lassen.

public class PasswordBoxSelectallBehavior : Behavior<PasswordBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.GotFocus += AssociatedObject_GotFocus;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.GotFocus -= AssociatedObject_GotFocus;
    }

    private void AssociatedObject_GotFocus(object sender, System.Windows.RoutedEventArgs e) => Dispatcher.InvokeAsync(AssociatedObject.SelectAll);
}

Damit funktioniert die Auswahl bei GotFocus automatisch und ohne Probleme.

Vorheriger Beitrag Nächster Beitrag