2009-10-26 2 views
3

J'ai une vue WPF avec deux zones de texte. Je souhaite déplacer automatiquement la mise au point de la première zone de texte vers la seconde lorsque l'utilisateur appuie sur la flèche vers le bas du clavier exactement comme le fait Tab.Déplacer le focus en réponse aux événements de clavier dans XAML

Il semble que je devrais être en mesure de le faire à 100% déclarative, mais pour une raison quelconque les commandes que je pensais faire cela ne semble pas faire quoi que ce soit. Voici ma première tentative qui ne fonctionne pas:

Est-ce que quelqu'un a déjà eu cette expérience? On dirait que je devrais pouvoir utiliser InputBindings ou un EventTrigger pour le faire. J'utilise MVVM et ceci est une préoccupation de View. Je pourrais juste tomber dans un petit codebehind (être un souci de vue, ceci est raisonnable), mais il me semble juste qu'il me manque quelque chose.

Répondre

5

J'espère que quelqu'un arrive avec quelque chose de plus élégant, mais c'est ce que j'ai jusqu'à présent. Ce n'est pas 100% XAML, mais c'est au moins générique.

Cet exemple montre une fenêtre avec deux boutons et deux zones de texte. La flèche vers le bas fait alterner le focus entre eux.

J'espère que cette aide.

<Window x:Class="WPF_Playground.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    > 
    <Window.CommandBindings> 
     <CommandBinding Command="ComponentCommands.MoveFocusDown" Executed="CommandBinding_Executed"/> 
    </Window.CommandBindings> 
    <StackPanel KeyboardNavigation.DirectionalNavigation="Cycle"> 
     <Button>Tester</Button> 
     <Button>Tester2</Button> 
     <TextBox Text="Test"> 
      <TextBox.InputBindings> 
       <KeyBinding Command="ComponentCommands.MoveFocusDown" Gesture="DOWN" /> 
      </TextBox.InputBindings> 
     </TextBox> 
     <TextBox Text="Test2"> 
      <TextBox.InputBindings> 
       <KeyBinding Command="ComponentCommands.MoveFocusDown" Gesture="DOWN" /> 
      </TextBox.InputBindings> 
     </TextBox> 
    </StackPanel> 
</Window> 

Le gestionnaire d'événements (pas de traitement d'erreur du tout):

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    UIElement senderElement = sender as UIElement; 
    UIElement focusedElement = FocusManager.GetFocusedElement(senderElement) as UIElement; 
    bool result = focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    Debug.WriteLine(result); 
} 
+0

+1 simplement Ouah! Le geste est quelque chose de nouveau pour moi –

Questions connexes