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:
Prześlij komentarz