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.