wpf LostFocus-event der Textbox

Dies ist mein xaml-Struktur

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

=> Diese Struktur kann die Schleife mehr. Wie:

<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>

In .cs-Datei, die ich definieren Ereignis-Fokus verloren, wie unten

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();
}

Das problem: Wenn es >= 2 textbox mit Wert leer ist ("").

  1. Ich auf das erste leere Textfeld => ich glaube nicht, beliebige Zeichen eingeben.
  2. Dann klicke ich auf den zweiten leeren textbox.

==> das Programm zeigt immer die Meldung Feld => Wenn ich auf OK-Taste, zeigt Es dem anderen. Es treten immer. Ich kann nicht schließen Sie das Programm.

Frage: Wenn ich >= 2 leere textbox und ich tun dasselbe wie das obige problem. Wie kann ich die Funktion text_LostFocus um das problem zu lösen???

STANDARD:

  • Wert dieser textbox ist immer leer (STANDARD)

  • Müssen, verwenden Sie BeginInvoke => Weil ich möchte, dass, wenn Benutzer klicken Sie auf zu texbox, muss der Benutzer geben Sie mindestens ein Zeichen.

  • Lustige Umsetzung XD, Wenn Sie zwei Textfelder, denken, was passiert: 1. Geben Sie die erste tb-2. Sie nichts angeben, und Sie auf die zweite 3. Das lostfocus-Ereignis tb1 feuert und es öffnet sich ein dialog, und konzentriert sich auf tb1 wieder 4. weil tb1 bekam gefasst, tb2 das lostfocus-Ereignis ausgelöst, und es macht das gleiche, Rückkehr Fokus auf tb2 und geht in eine Endlosschleife.
  • Auch - keine Notwendigkeit für BeginInvoke. Sie sind bereits auf dem UI-thread.
  • Ich dachte, das ist WPF eine nicht WinForms, diese System.Windows.Forms.DialogResult kann leicht ersetzt werden, mit System.Windows.MessageBox!
  • was ist, wenn Sie versuchen, reagieren auf PreviewLostKeyboardFocus? AFAIK, kommt es auch vor den anderen tb den Fokus erhält. Aus MSDN: Wenn die PreviewGotKeyboardFocus Ereignis oder die PreviewLostKeyboardFocus Ereignis behandelt wird, den Tastatur-Fokus nicht ändern.
  • Vielen Dank an alle. @Moti Azu Müssen, verwenden Sie BeginInvoke => Weil ich möchte, dass, wenn Benutzer klicken Sie auf zu texbox, muss der Benutzer geben Sie mindestens ein Zeichen.. Wenn ich klicken Sie auf das erste Textfeld, und klicken Sie auf I aus der (nicht klicken Sie auf das zweite Textfeld), BeginInvoke wird mir helfen, zu konzentrieren auf die erste textbox für den Benutzer geben Sie mindestens den Charakter.
  • Ich würde abraten, zeigt ein pop-up, wenn jemand verlässt eine textbox ohne Eingabe von Daten: es ist wirklich ärgerlich. Markieren Sie es visuell (z.B. ein rotes Kreuz neben es); auch nicht, aktivieren Sie die senden-Taste, bis die Mindestanforderungen erfüllt sind.
  • Meine diese Textfelder generieren, wenn Benutzer klicken Sie auf die Schaltfläche hinzufügen. So muss der Benutzer geben Sie mindestens ein Zeichen für dieses Textfeld, um fortzufahren. Dies ist Bedingung.
  • BeginInvoke nicht tun, was Sie sagen, es läuft einfach code auf eine bestimmte dispatcher. textbox.Dispatcher.BeginInvoke((Action)(() => { textbox.Focus(); })); sollte ersetzt werden, mit textbox.Focus();
  • Azu, Wenn ich entfernen, BeginInvoke, die Meldung zeigt nur einmal. So kann der Benutzer lassen Sie dieses Textfeld, während textbox.text ist leer.

InformationsquelleAutor GSP | 2015-01-07
Schreibe einen Kommentar