2017-04-04 2 views
0

je une grille qui contient comme peu TextBoxes ci-dessous les uns des autres:Problème avec l'événement de tir KeyDown sur TextBox quand il est « sauter » à une zone de texte WPF Grille

enter image description here

en appuyant sur Entrée, je dois sauter de txt1 à txt2 de txt2 à txt3 et ainsi de suite, et je l'ai résolu comme ceci:

private void Grid_PreviewKeyDown_1(object sender, KeyEventArgs e) 
{ 
    try 
    { 
     if (e.Key == Key.Enter) 
     { 
      UIElement element = e.Source as UIElement; 

      element.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
      //e.Handled = true; 

     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

et ma question est ici, sur chacune des boîtes de txt en appuyant sur ENTRER je calculer quelque chose d'une autre txtBoxes, et quand J'appuie sur enter sur txt1 ça va sauter sur txt2 et imme diatelly appeler événement txt2_KeyDown, que je veux éviter .. Je veux appeler txt2_KeyDown événement quand je suis debout « » sur txt2 et quand j'appuyez sur Entrée ..

-à-dire:

private void txt2_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
     try 
     { 

      CalculateSomethingFromOtherTextBoxes(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

Ce qui précède est être viré quand je suis 'debout' sur txt1 et quand je veux sauter à txt2 en appuyant sur Entrée, comment puis-je simplement 'sauter' sans appeler l'événement txt2 KeyDown Si je n'ai pas appuyé sur Enter alors que je suis vraiment 'debout' sur 'txt2 '.

Merci les gars, Vive

+0

Peut-être vous peut créer une nouvelle variable d'aide? Je veux dire, si vous mettez le focus sur suivant, définissez cette variable sur true. Dans txt2 keydown check, si c'est vrai, mettez cette variable à false et mettez aussi return. Je ne sais pas pour l'instant d'autres solutions – Niewidzialny

Répondre

1

Et ma question est ici, sur chacune des boîtes de txt en appuyant sur Entrée je calculer quelque chose d'un autre txtBoxes, et quand je presse entrer sur txt1 il va sauter sur txt2 et appeler immediatelly événement txt2_KeyDown, que je veux pour éviter .. Je veux appeler événement txt2_KeyDown quand je suis debout « » sur txt2 et quand j'appuyez sur Entrée ..

Ensuite, vous pouvez gérer l'événement LostKeyboardFocus de « txt2 » au lieu de traiter l'événement KeyDown:

private Key key; 
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    key = e.Key; 
    if (key == Key.Enter) 
    { 
     UIElement element = e.OriginalSource as UIElement; 
     element.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    } 

} 

private void txt2_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    if (key == Key.Enter) 
    { 
     CalculateSomethingFromOtherTextBoxes(); 
    } 
} 
+0

Le code à l'intérieur de "txt2_LostKeyboardFocus" ne sera jamais exécuté. Sur l'événement LostKeyboardFocus, comment pouvez-vous vérifier l'entrée "Enter"? – Parag

+0

Bien sûr, vous devez connecter le gestionnaire d'événements. Je stocke la dernière touche enfoncée dans le champ clé. – mm8

1

Le problème est dû au fait d'un événement KeyDown que vous attaché à. Textboxes

Au lieu de cela, supprimez cet événement et ajoutez l'événement PreviewKeyDown.

Ainsi, votre signature de la méthode devrait être quelque chose comme ceci:

private void txt2_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
     { 
      try 
      { 

       CalculateSomethingFromOtherTextBoxes(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
} 

Je l'ai testé et il fonctionne comme prévu.

+0

pouvez-vous l'expliquer un peu plus? Il est déclenché parce que j'ai attaché l'événement KeyDown sur mes TextBoxes et quand element.MoveFocus est déclenché il déclenche immédiatement KeyDown parce que je l'ai créé et ai mis du code dedans? –

+0

L'événement KeyDown est un événement bouillonnant alors que PreviewKeyDown est un événement de tunneling. Vous pouvez rechercher plus sur ces événements. – Parag

+1

Lorsque nous utilisons l'événement PreviewKeyDown, il est d'abord géré par, dans notre cas "Grid" et après cela, il va dans le gestionnaire d'événements de textbox. Envisager le cas d'utilisation actuel. Vous cliquez sur "Entrée" sur textbox1. Tout d'abord, il ira à "Grid" et après cela, il viendra au gestionnaire de textbox 1. Donc, l'événement de textbox 2 ne sera pas soulevé, parce que cet événement a été soulevé à l'origine par la zone de texte 1. J'espère que cela clarifie votre doute. – Parag