【问题标题】:DatePickerTextBox GotFocus eventDatePickerTextBox GotFocus 事件
【发布时间】:2018-02-21 18:05:13
【问题描述】:

如何从 DatePickerTextBox 捕获 GotFocus 事件,DatePickerDatePickerTextBox GotFocusGotKeyboardFocus 事件不会触发。

【问题讨论】:

    标签: c# wpf datepicker


    【解决方案1】:

    GotFocus 事件在内部由DatePicker 处理。默认情况下,它会为所有由其文本框触发的 GotFocus RoutedEvents 更改 e.Handled = true

    DatePicker.GotKeyboardFocus 事件不受此影响。您仍然可以收听该事件。

    为了触发GotFocus 事件,您必须显式添加一个事件处理程序来监听它并将e.Handled 更改为false。即:

    DatePicker1.AddHandler(DatePicker.GotFocusEvent, new RoutedEventHandler(DatePicker1_GotFocus), true);
    void DatePicker1_GotFocus(object sender, RoutedEventArgs e)
    {
        e.Handled = false;
    }
    

    更新:

    使用PreviewKeyDown事件打开日历:

    void DatePicker1_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        var dp = sender as DatePicker;
        if (e.Key == Key.Tab)
        {
            dp.IsDropDownOpen = true;
        }      
    }
    

    【讨论】:

    • 该解决方案适用于GotFocus,但我正在尝试打开日历private void DpTb_GotFocus(object sender, RoutedEventArgs e) { e.Handled = false; dateP.IsDropDownOpen = true; },但它抛出了一个异常System.InvalidOperationException: 'Cannot reopen a popup in the closed event handler.'
    • 可以通过绑定PreviewKeyDown DatePicker的事件来实现。
    • 我只想在 DatePicker 通过鼠标单击或 Tab 键获得焦点时打开下拉菜单,而不是在文本框获得焦点时按一个键
    • @user9285072 查看我的更新答案,您可以通过e.Key处理密钥选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多