wpf événement LostFocus de la zone de texte

C'est mon xaml structure

<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
</StackPanel>

=> Cette structure peut faire une boucle plus. Tels que:

<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
</StackPanel>
<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
</StackPanel>

Dans .cs fichier, j'définir l'événement perdu le focus comme ci-dessous

private void text_LostFocus(object sender, RoutedEventArgs e)
{
   TextBox textbox = ((TextBox)sender);
   if (textbox.Text.Trim().Length == 0)
   {
      System.Windows.Forms.DialogResult result1 = System.Windows.Forms.MessageBox.Show("Empty string!", "Warning",
                 System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
                textbox.Dispatcher.BeginInvoke((Action)(() => { textbox.Focus(); }));
       return;
    }
    textbox.ScrollToHome();
}

Le problème: Si il y a >= 2 zone de texte ayant valeur est vide ("").

  1. Je clique sur le premier vide la zone de texte => je ne suis pas d'entrer n'importe quel caractère.
  2. Puis je clique sur la deuxième zone de texte vide.

==> Programme de toujours afficher la boîte de message => Si je clique sur le bouton OK, C'est montrer un autre. Elle se produira jamais. Je ne peux pas fermer le programme.

Question: Si j'ai >= 2 zone de texte vide et je n'ai même que le problème ci-dessus. Comment puis-je changer la fonction text_LostFocus pour résoudre le problème???

Par DÉFAUT:

  • Valeur de ces textbox est toujours vide (par DÉFAUT)

  • Devez utiliser BeginInvoke => Parce que je veux que lorsque l'utilisateur cliquez pour texbox, l'utilisateur doit entrer moins un caractère.

  • Drôle de mise en œuvre XD Quand vous avez deux zones de texte, pensez à ce qui se passe: 1. Vous entrez dans le premier de la tuberculose 2. Vous ne saisissez rien et vous cliquez sur le deuxième de 3. L'événement lostfocus de tb1 feux et il ouvre une boîte de dialogue, et se concentre sur tb1 nouveau 4. parce que tb1 ai focus, tb2 événement lostfocus feux et il en fait de même, le retour se concentrer à tb2 et passe dans une boucle infinie.
  • Aussi, pas besoin de BeginInvoke. Vous êtes déjà sur le thread de l'INTERFACE utilisateur.
  • Je pensais que ce WPF est un pas WinForms, ce System.Windows.Forms.DialogResult peut être facilement remplacé par System.Windows.MessageBox!
  • que faire si vous essayez de réagir sur PreviewLostKeyboardFocus? Autant que je sache, il se produit avant même de l'autre ct obtient le focus. À partir de MSDN: Si le PreviewGotKeyboardFocus de l'événement ou de la PreviewLostKeyboardFocus événement est pris en charge, le focus du clavier ne change pas.
  • Merci à tous. @Moti Azu Doit utiliser BeginInvoke => Parce que je veux que lorsque l'utilisateur cliquez pour texbox, l'utilisateur doit entrer moins un caractère.. Si je clique sur la première zone de texte et que je clique en dehors (pas de cliquer sur la deuxième zone de texte), BeginInvoke va m'aider à me concentrer sur la première zone de texte pour l'utilisateur de saisir au moins sur le personnage.
  • Je ne vous le conseille montrant un pop-up à chaque fois que quelqu'un quitte une zone de texte sans entrer de données: il est vraiment ennuyeux. Marque visuellement (par exemple, la croix-rouge, en outre, il); aussi, ne pas activer le bouton "soumettre" jusqu'à ce que les exigences minimales sont remplies.
  • Mon ces zones de texte génère lorsque l'utilisateur clique sur le bouton ajouter. Ainsi l'utilisateur doit entrer au moins un caractère pour cette zone de texte pour continuer. C'est la condition.
  • BeginInvoke ne fait pas ce que vous dites, il fonctionne code sur un répartiteur. textbox.Dispatcher.BeginInvoke((Action)(() => { textbox.Focus(); })); doit être remplacé par textbox.Focus();
  • Azu, Si je retire BeginInvoke, la boîte de message affiche qu'une seule fois. De sorte que l'Utilisateur peut quitter cette zone de texte tandis que la zone de texte.le texte est vide.

InformationsquelleAutor GSP | 2015-01-07