Silverlight: Automatische Selektion einer TextBox bei Fokuserhalt

Eine häufige Anforderung: Erhält eine TextBox den Fokus, soll der Inhalt ganzheitlich selektiert werden. Dafür gibt es keine eigene Eigenschaft, die verwendet werden könnte. Es gibt lediglich die Methoden Select (für die Auswahl eines bestimmten Bereichs) oder SelectAll für die Auswahl des gesamten Textes.
Die erste Idee wäre nun die Prüfung der Codebehind auf Änderungen des Fokuses inklusive Behandlung. Dies ist aber weder eine wiederverwendbare Lösung, noch ist sie sauber zu nennen.

Statt dessen bietet sich die Verwendung von Attached Properties an. Wir erstellen dazu eine eigene Klasse, welche eine Dependency Property und die entsprechenden Getter und Setter anbietet. Diese beschreiben, ob die vollständige Auswahl aktiviert ist oder nicht. Bei einer Änderung der Eigenschaft wird geprüft, welcher Wert gesetzt wurde. Wurde sie auf true gesetzt, wird das Ereignis GotFocus abonniert, andernfalls wird dieses Abonnement wieder gelöst. Im entsprechenden Ereignishandler wird nun das angedockte Element über den FocusManager bezogen und der vorhandene Text selektiert.

public class TextBoxSelector

{

    public static readonly DependencyProperty SelectAllOnFocusProperty =

        DependencyProperty.RegisterAttached(

            "SelectAllOnFocus", 

            typeof(bool), 

            typeof(TextBoxSelector), 

            new PropertyMetadata(OnSelectAllOnFocusPropertyChanged));

 

    private static void OnSelectAllOnFocusPropertyChanged(

        DependencyObject sender, 

        DependencyPropertyChangedEventArgs e)

    {

        FrameworkElement element = sender as FrameworkElement;

        if (element != null)

        {

            if ((bool)e.NewValue)

                element.GotFocus += OnFocus;

            else

                element.GotFocus -= OnFocus;

            

        }

    }

 

    public static bool GetSelectAllOnFocus(

        DependencyObject o)

    {

        return (bool)o.GetValue(SelectAllOnFocusProperty);

    }

 

    public static void SetSelectAllOnFocus(

        DependencyObject o, 

        bool selectAll)

    {

        o.SetValue(SelectAllOnFocusProperty, selectAll);

    }

 

    static void OnFocus(object sender, RoutedEventArgs e)

    {

        TextBox focusedTextBox = 

            FocusManager.GetFocusedElement() as TextBox;

        if (focusedTextBox != null)

        {

            focusedTextBox.SelectAll();

        }

    }

}

Für die Verwendung ist die eben erstellte Klasse per XML Namespace ins XAML einzubinden:

xmlns:ui="clr-namespace:SelectionDemo.Helper"

Für die Einbindung gibt es nun mehrere Möglichkeiten. Zum einen ist es möglich, die Attachted Property direkt auf jeder TextBox zu setzen, und auf true zu stellen, für welche diese Funktionalität Anwendung finden sollte. Allerdings ist es auch möglich, dies auf einem Panel bzw. einem beliebigen Container zu setzen. Diese Einstellung bezieht sich dann auf alle Kinder vom Typ TextBox:

<Grid 

  Grid.Row="0" 

  Grid.Column="0"

  ui:TextBoxSelector.SelectAllOnFocus="true">

 

  <TextBox Text="{Binding FirstName}"/>

  <TextBox Text="{Binding LastName}"/>

 

</Grid>

Attached Properties sind eine gute Möglichkeit, zusätzliche Funktionalitäten unter zu bringen, ohne Codebehind für eine View schreiben zu müssen bzw. den Einsatz von entsprechenden Patterns zu unterstützen. Dieses Beispiel zeigt, wie einfach es eigentlich ist.

Veröffentlicht von Norbert Eder

Ich bin ein leidenschaftlicher Softwareentwickler. Mein Wissen und meine Gedanken teile ich nicht nur hier im Blog, sondern auch in Fachartikeln und Büchern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Cookie-Einstellungen
Auf dieser Website werden Cookie verwendet. Diese werden für den Betrieb der Website benötigt oder helfen uns dabei, die Website zu verbessern.
Alle Cookies zulassen
Auswahl speichern
Individuelle Einstellungen
Individuelle Einstellungen
Dies ist eine Übersicht aller Cookies, die auf der Website verwendet werden. Sie haben die Möglichkeit, individuelle Cookie-Einstellungen vorzunehmen. Geben Sie einzelnen Cookies oder ganzen Gruppen Ihre Einwilligung. Essentielle Cookies lassen sich nicht deaktivieren.
Speichern
Abbrechen
Essenziell (1)
Essenzielle Cookies werden für die grundlegende Funktionalität der Website benötigt.
Cookies anzeigen