Technology Experience
.NET World

WinRT, Xaml, TextBox e selezione del testo

Ho cercato di riassumere lo scopo del post nel titolo, ma lo riassumo qui per maggiore chiarezza. Lo scopo è quello di scatenare il ‘seleziona tutto il testo’ quando una TextBox prende il focus. Chiaramente in ottica MVVM, quindi senza sporcare il code-behind della pagina. E’ uno dei comportamenti di default che più mi mancano, anche perchè sarebbe bastato aggiungere una proprietà AutoSelectAll nella TextBox e parecchi developer sarebbero stati più contenti.

Fortunatamente è piuttosto semplice scrivere una classe che raggiungere lo stesso risultato.

public static class TextBoxHelper
{
    public static bool GetAutoSelectAll(DependencyObject obj)
    {
        return (bool)obj.GetValue(AutoSelectAllProperty);
    }

    public static void SetAutoSelectAll(DependencyObject obj,
        bool value)
    {
        obj.SetValue(AutoSelectAllProperty, value);
    }

    public static readonly DependencyProperty AutoSelectAllProperty =
        DependencyProperty.RegisterAttached("AutoSelectAll",
        typeof(bool),
        typeof(TextBoxHelper),
        new PropertyMetadata(null,
        new PropertyChangedCallback(Setup)));

    private static void Setup(DependencyObject obj,
        DependencyPropertyChangedEventArgs e)
    {
        TextBox tb = obj as TextBox;

        if (tb != null)
        {
            bool oldValue = (bool)e.OldValue;
            bool newValue = (bool)e.NewValue;

            if (oldValue == false && newValue == true)
            {
                tb.GotFocus += tb_GotFocus;
            }
            else if (oldValue == true && newValue == false)
            {
                tb.GotFocus -= tb_GotFocus;
            }
        }
    }

    static void tb_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox tb = sender as TextBox;

        if (tb != null)
        {
            tb.SelectAll();
        }
    }
}

Questa classe va ovviamente utilizzata nello XAML:

<TextBox common:TextBoxHelper.AutoSelectAll="True" />

Quando questa TextBox prende il focus, il testo in esso contenuto viene automaticamente selezionato grazie al behavior che gli abbiamo agganciato. Tutto questo direttamente nello XAML, senza code-behind, in perfetta sintonia con MVVM.

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.