【发布时间】:2018-02-21 18:05:13
【问题描述】:
如何从 DatePickerTextBox 捕获 GotFocus 事件,DatePicker 和 DatePickerTextBox GotFocus 和 GotKeyboardFocus 事件不会触发。
【问题讨论】:
标签: c# wpf datepicker
如何从 DatePickerTextBox 捕获 GotFocus 事件,DatePicker 和 DatePickerTextBox GotFocus 和 GotKeyboardFocus 事件不会触发。
【问题讨论】:
标签: c# wpf datepicker
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 键获得焦点时打开下拉菜单,而不是在文本框获得焦点时按一个键
e.Key处理密钥选择