Kolumne: XAML Expertise

WPF: so selektiert man TextBox-Text automatisch
Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute erklärt Gregor Biswanger, wie man in WPF TextBox Text automatisch selektiert.

Bei einem Klick auf eine TextBox soll der Text automatisch selektiert werden. Diese Anforderung klingt simpel, denn der erste Gedanke ist hierbei oft das Abonnieren des GotFocus-Events. Erhält die TextBox ihren Fokus, so kann die SelectAll-Methode den Text markieren. Das funktioniert allerdings nur sporadisch und nicht bei allen Szenarien, die auftreten können. Die Fokussierung kann durch einen Mausklick, Tastendruck, Stifteingabe oder Touch erfolgen. Wird direkt auf eines dieser Events reagiert, funktioniert die SelectAll-Methode zuverlässig. Bei einem weiteren Klick muss dann der Cursor genau an der gewünschten Stelle positioniert und die Selektion aufgehoben werden.

WPF: TextBox-Text automatisch selektieren

Soll die Funktion für alle TextBox-Steuerelemente erfolgen, ist ein allgemeiner Zugriff via App.xaml.cs-Datei ideal. Der Beispielcode dazu steht in Listing 1. Ebenfalls wäre das Schreiben eines Behaviors möglich, um nur bestimmte TextBox-Steuerelemente mit dieser Funktionalität zu erweitern.

Listing 1: „TextBox“-Steuerelemente bei Fokussierung automatisch selektieren

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(SelectivelyIgnoreMouseButton));
        EventManager.RegisterClassHandler(typeof(TextBox), UIElement.GotKeyboardFocusEvent, new RoutedEventHandler(SelectAllText));
        EventManager.RegisterClassHandler(typeof(TextBox), Control.MouseDoubleClickEvent, new RoutedEventHandler(SelectAllText));
            
        base.OnStartup(e);
    }

    void SelectivelyIgnoreMouseButton(object sender, MouseButtonEventArgs e)
    {
        DependencyObject parent = e.OriginalSource as UIElement;
        while (parent != null && !(parent is TextBox))
        {
            parent = VisualTreeHelper.GetParent(parent);
        }

        if (parent != null)
        {
            var textBox = (TextBox)parent;
            if (!textBox.IsKeyboardFocusWithin)
            {
                textBox.Focus();
                e.Handled = true;
            }
        }
    }

    void SelectAllText(object sender, RoutedEventArgs e)
    {
        var textBox = e.OriginalSource as TextBox;
        if (textBox != null)
        {
            textBox.SelectAll();
        }
    }
}

Aufmacherbild: Three businessmen are holding a check boxesvon Shutterstock.com / Urheberrecht: Ismagilov

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -