niedziela, 2 lutego 2014

Kod: przeskakiwanie do innego pola tekstowego

W niektórych aplikacjach Windows Phone podoba mi się usprawnienie, polegające na tym, że po naciśnięciu przycisku Enter w polu tekstowym automatycznie przechodzimy do kolejnego TextBox-a. Jest to wygodne i przyspiesza używanie aplikacji - sam to implementuję jak tylko mogę... A nie da się oczywiście w polach z takim InputScope, w którym przycisk Enter jest niedostępny :)

Jako że implementacja tej funkcjonalności za każdym razem jest uciążliwa, to warto tutaj zastosować behaviors. Posiadając poniższą klasę w osobnym projekcie z często używanymi klasami bardzo szybko możemy dodać omawianą funkcjonalność do kontrolki TextBox (również do Telerikowego RadTextBox-a czy RadAutoCompleteBox-a, ponieważ dziedziczą one po standardowym TextBox).

Krok 1: klasa TextBoxFocusNextOnEnterBehavior


Do jakiegoś osobnego projektu, w którym trzymamy przydatny kod, dodajemy poniższą klasę.

public class TextBoxFocusNextOnEnterBehavior : Behavior<TextBox>
{
    public string FocusOn { get; set; }

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

        AssociatedObject.KeyUp += AssociatedObject_KeyUp;
    }

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

        AssociatedObject.KeyUp -= AssociatedObject_KeyUp;
    }

    void AssociatedObject_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            if (!string.IsNullOrWhiteSpace(FocusOn))
            {
                var ctrl = this.AssociatedObject.FindName(FocusOn) as Control;

                if (ctrl != null && ctrl.Visibility == System.Windows.Visibility.Visible)
                {
                    ctrl.Focus();
                }
            }
        }
    }
}

Krok 2: XAML

Już we właściwym projekcie z naszą aplikacją musimy oczywiście posiadać w XAML-u co najmniej dwa pola tekstowe, a to do którego chcemy przeskoczyć musi być nazwane, bo po nazwie są wyszukiwane kontrolki. W atrybucie FocusOn podajemy nazwę kolejnej kontrolki typu TextBox, na której chcemy dostać focus.

<telerikPrimitives:RadTextBox>
    <i:Interaction.Behaviors>
        <myBehaviors:TextBoxFocusNextOnEnterBehavior FocusOn="nextTextBox" />
    </i:Interaction.Behaviors>
</telerikPrimitives:RadTextBox>
<telerikPrimitives:RadTextBox x:Name="nextTextBox"/>

Krok 3: referencje

Powyższy kod nie skompiluje się dopóki nie zrobimy porządku z przestrzeniami nazw:
  • do nagłówka phone:PhoneApplicationPage dodajemy poniższe atrybuty (oczywiście podając prawidłowe nazwy do swojego projektu, gdzie znajduje się kod z kroku 1):
    xmlns:myBehaviors="clr-namespace:MyTools.MyBehaviors;assembly=MyAssembly"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
  • jeśli projekt nie ma takiej referencji, to dodajemy również referencję do System.Windows.Interactivity

Krok 4: używanie w innych projektach

Jeśli kod z kroku 1 umieścimy w osobnym projekcie, tak jak radziłem, to dla każdej innej aplikacji wystarczy wykonać kroki 2 i 3, aby włączyć opisywaną funkcjonalność.

Brak komentarzy: