2016-11-14 3 views
0

У меня есть MaskedTextBox, который я хочу проверить, когда программа теряет фокус на нем. Мой метод работает так, как я хочу отказаться от одной проблемы, событие запускается снова и снова, а не только один раз (когда пользователь вводит недопустимую дату).Устранение метода LostFocus Несколько раз

Это метод, который я использую;

private void onDateTextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    TextBox _dateTexBox = sender as TextBox; 
    if (!_dateTexBox.IsKeyboardFocusWithin) 
    { 
     if (Convert.ToInt32(dateTextBox.Text.Substring(0, 2)) > 31) 
     { 
      MessageBox.Show("Invalid day."); 
      dateTextBox.Focus(); 
     } 

     if (Convert.ToInt32(dateTextBox.Text.Substring(3, 2)) > 12) 
     { 
      MessageBox.Show("Invalid month."); 
      dateTextBox.Focus(); 
     } 

     if (Convert.ToInt32(dateTextBox.Text.Substring(6, 4)) > 2100) 
     { 
      MessageBox.Show("Invalid year."); 
      dateTextBox.Focus(); 
     } 
    } 
} 

Я вошел в IsKeyboardFocusWithin проверки, однако это событие еще выстреливает несколько раз. Как я могу гарантировать, что событие срабатывает только один раз?

ответ

2

Как указано в WPF DatePicker LostFocus fires seven times

LostFocus является маршрутизацией событие стратегии маршрутизации, установленным в Пузырь. По пузырь это означает, что он будет пузыриться до родительского до корневого окна до обрабатывается где-то, явно устанавливая e.Handled = true ;.

Итак, это означает, что даже когда ребенок будет контролировать свободный фокус, он будет пузыриться до до вашего дня. Это значит, что вы видите несколько обращений к вашему методу.

Надеюсь, это вам поможет.

+0

Привет Мик спасибо за ваше время. Если я правильно прочитал, то добавление 'e.Handled = true' в событие' LostFocus' не остановит событие от пузырьков, и я уже попробовал метод, предложенный в этом ответе ('IsKeyboardFocusWithin'). Не могли бы вы объяснить немного больше? – CBreeze

Смежные вопросы