让DatePicker的日历在文本框聚焦时保持打开状态

时间:2014-07-02 20:25:58

标签: c# .net wpf datepicker

我正在使用默认的WPF Datepicker控件。我想在用户选择DP文本框时打开日历,这样他们就可以更清楚地使用日历来选择日期。但是,似乎只要DP的文本框获得焦点,它也会关闭日历弹出窗口。

如果我使用这个简单的函数打开日历,例如,日历打开,然后关闭,然后发送InvalidOperationException:“无法在已关闭的事件处理程序中重新打开弹出窗口。”这对我来说意味着当一个日历打开它需要焦点,然后文本框收回焦点并关闭弹出窗口,然后触发错误。

private void DatePicker_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        DatePicker d = sender as DatePicker;
        d.IsDropDownOpen = true;
    }

关于如何制止这种混乱并且只是让日历弹出窗口和所选文本框安然无恙的任何想法?

2 个答案:

答案 0 :(得分:1)

您需要在日历上设置StaysOpen="true"

使用Blend为日期选择器创建控件模板,然后找到"PART_Popup"

    <Popup x:Name="PART_Popup" 
           AllowsTransparency="True" 
           Placement="Bottom" 
           StaysOpen="true" />                 

答案 1 :(得分:0)

一种方法是创建一个包含以下元素的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>

自己处理关于Popup的自定义逻辑。请注意,这不是一项微不足道的任务,因为您需要:

  • 提取原始DatePicker日历按钮模板,使其看起来与本机控件相同
  • 处理将关闭弹出窗口的各种事件(例如,在日历的月视图中导航)

它确实为您提供了进一步自定义Popup的好处。例如,在我在工作中使用的解决方案中,客户已经要求提供“今天”服务。日历中的按钮。如果您认为必须保持这样的控制是值得的,我可以提供一些有关我们实施的细节,但如果这不是您的选择,我还不会发布它们。