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