C# LostFocus方法多次发射

C# LostFocus方法多次发射,c#,wpf,xaml,C#,Wpf,Xaml,我有一个MaskedTextBox,我想在程序失去焦点时验证它。我的方法的工作原理是,除了一个问题之外,事件会一次又一次地触发,而不是仅仅触发一次(当用户输入无效日期时) 这就是我正在使用的方法 private void onDateTextBox_LostFocus(object sender, RoutedEventArgs e) { TextBox _dateTexBox = sender as TextBox; if (!_dateTexBox.IsKeyboardFoc

我有一个
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是路由策略设置为Bubble的路由事件。通过 气泡它意味着它将一直气泡到它的父窗口,直到根窗口 通过显式设置e.handled=true;在某处处理

所以,这意味着,即使孩子控制的焦点不集中,它也会冒泡 对于你的日期选择器,这就是为什么你看到你的方法多次点击

希望这对您有所帮助。

如中所述

LostFocus是路由策略设置为Bubble的路由事件。通过 气泡它意味着它将一直气泡到它的父窗口,直到根窗口 通过显式设置e.handled=true;在某处处理

所以,这意味着,即使孩子控制的焦点不集中,它也会冒泡 对于你的日期选择器,这就是为什么你看到你的方法多次点击


希望这对您有所帮助。

嗨,米克,谢谢您抽出时间。如果我读得正确,那么将
e.Handled=true
添加到
LostFocus
事件不会阻止事件冒泡,我已经尝试了该答案中建议的方法(
IsKeyboardFocusWithin
)。你能再解释一下吗?嗨,米克,谢谢你抽出时间。如果我读得正确,那么将
e.Handled=true
添加到
LostFocus
事件不会阻止事件冒泡,我已经尝试了该答案中建议的方法(
IsKeyboardFocusWithin
)。你能再解释一下吗?