Вы не можете перезаписать "это". Это указывает на текущий экземпляр объекта.
Ваша методика проверки здесь, честно говоря, очень плохая. Тем не менее, я считаю, что проблема просто в том, что WPF обрабатывает вкладку после того, как вы установили фокус, поэтому он устанавливает фокус обратно на следующий элемент в порядке фокуса.
Простым обходным путем было бы отправить отдельное сообщение которое обрабатывается после текущего сообщения:
if (day < 0 || day > 31)
{
MessageBox.Show("Please enter a correct day.");
b.Text = string.Empty;
Dispatcher.BeginInvoke((ThreadStart)delegate
{
b.Focus();
});
}
Это гарантирует, что WPF полностью обработает обработчик событий LostFocus
, прежде чем он обработает отдельное сообщение, чтобы установить фокус на ошибочном элементе управления.
Что касается того, как вы Если бы вы могли решить эту проблему гораздо лучше, вы могли бы:
IDataErrorInfo
в модели представления TextBox
es в пользовательском интерфейсе для соответствующих свойств в модели представления (предварительное условие: прочтите о привязке данных WPF)