使DatePicker's Calendar在文本框聚焦时保持打开状态
本文关键字:聚焦 状态 文本 DatePicker Calendar | 更新日期: 2023-09-27 18:11:08
我使用默认的WPF Datepicker控件。我希望在用户选择DP文本框时打开Calendar,以便更清楚地看到他们也可以使用日历来选择日期。然而,似乎每当DP的文本框得到焦点,它也关闭日历弹出。
如果我使用这个简单的函数打开日历,例如,日历打开,然后关闭,然后发送InvalidOperationException:"不能在关闭的事件处理程序中重新打开弹出窗口。"这对我来说意味着,当日历打开时,它会获得焦点,然后文本框会收回焦点并关闭弹出窗口,然后触发错误。
private void DatePicker_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
DatePicker d = sender as DatePicker;
d.IsDropDownOpen = true;
}
关于如何阻止这种混乱,只是让日历弹出和选定的文本框生活在和平的想法吗?
您需要在日历上设置StaysOpen="true"
使用Blend为日期选择器创建一个控件模板,然后找到"PART_Popup"
:
<Popup x:Name="PART_Popup"
AllowsTransparency="True"
Placement="Bottom"
StaysOpen="true" />
一种方法是创建包含以下元素的UserControl:
<DatePickerTextBox x:Name="TextBox" GotFocus="DatePickerTextBox_GotFocus" LostFocus="DatePickerTextBox_LostFocus"/>
<Button Click="Button_Click" Grid.Column="1">Pick</Button>
<Popup x:Name="MyPopup" StaysOpen="True" PlacementTarget="{Binding ElementName=TextBox}">
<Calendar Focusable="False"/>
</Popup>
和处理您的自定义逻辑关于弹出自己。请注意,这不是一个简单的任务,因为您需要:
- 提取原始DatePicker日历按钮模板,使其看起来与本机控件相同
- 处理各种事件,将关闭弹出(例如导航月视图的日历)
它确实给了你能够进一步定制弹出窗口的好处。例如,在我在工作中使用的解决方案中,客户要求在日历中添加"Today"按钮。如果您认为必须维护这样的控件是值得的,我可以提供一些关于我们实现的细节,但如果这不是您的选择,我不会发布它们。