加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WPF DatePicker LostFocus触发七次

发布时间:2020-12-16 02:02:47 所属栏目:百科 来源:网络整理
导读:我这里有一个非常简单的场景.请看布局,请: Grid Grid.RowDefinitions RowDefinition/RowDefinition RowDefinition/RowDefinition /Grid.RowDefinitions TextBox Grid.Row="0"/TextBox DatePicker Grid.Row="1" Name="_datePicker" LostFocus="_datePicker_O
我这里有一个非常简单的场景.请看布局,请:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0"></TextBox>
    <DatePicker Grid.Row="1" 
                Name="_datePicker"
                LostFocus="_datePicker_OnLostFocus"></DatePicker>
</Grid>

和代码隐藏:

private void _datePicker_OnLostFocus(object sender,RoutedEventArgs e)
{
    Debug.WriteLine("LostFocuse");
}

所以,麻烦的是当我拿起一些日期然后点击TextBox然后,事件LostFocus激发7(七!)次.一个当DatePicker失去了焦点,当我在TextBox上开始并且完全剩下6次时,我无法解释.

我该如何解决?我只需要一次这次活动.或者我可以使用其他一些活动?我用同样的结果尝试了LostKeyBoardFocus.

解决方法

LostFocus是路由策略设置为Bubble的路由事件.通过泡沫意味着它会向其父窗口冒泡直到根窗口,直到通过显式设置e.Handled = true;来处理它.

所以,这意味着即使当孩子控制松散焦点时,它也会冒泡到你的datePicker,这就是为什么你会看到你的方法的多次命中.

您可以检查属性IsKeyboardFocusWithin,如果焦点位于您的控件中,则返回该属性.由于您对监听子丢失焦点事件不感兴趣,因此您可以在此处理程序中检查此属性,并仅在datePicker丢失实际焦点时执行代码:

private void _datePicker_OnLostFocus(object sender,RoutedEventArgs e)
{
    DatePicker picker = sender as DatePicker;
    if (!picker.IsKeyboardFocusWithin)
    {
        System.Diagnostics.Debug.WriteLine("LostFocuse");
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读