LostFocus方法多次触发

本文关键字:方法 LostFocus | 更新日期: 2023-09-27 18:17:54

我有一个MaskedTextBox,我想在程序失去对它的关注时验证它。我的方法的工作方式,我想撇开一个问题,事件触发一次又一次,而不是只有一次(当用户输入一个无效的日期)。

这是我使用的方法;

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检查,但是事件仍然多次触发。如何确保事件只触发一次?

LostFocus方法多次触发

如WPF DatePicker中所述,LostFocus触发七次

LostFocus是一个路由策略设置为Bubble的路由事件。通过冒泡它的意思是它会冒泡到它的父窗口直到根窗口e.Handled = true;

所以,这意味着即使子控件失去焦点,它也会冒出来到你的datePicker,这就是为什么你看到多个点击到你的方法。