必须在WPF中的Calendar中单击两次

use*_*399 17 c# wpf focus

编辑2:谢谢大家的反馈.我通过将其添加到我的SelectedDatesChanged事件来解决了这个问题:

Mouse.Capture(null);

当我在日历中选择日期时,我想点击"开始"按钮.但是,我需要点击两次"开始"按钮:一次取消对焦日历,再次实际按下它.如果在其中选择了一个项目,则鼠标离开事件不会在日历上触发,并且Keyboard.ClearFocus()也不会对其进行去焦点.

请问,每当我选择日期时,如何摆脱日历的焦点?谢谢!

编辑:接下来单击"开始"按钮仅仅是一个例子; 如果我想选择一个文本框而我刚刚选择了一个日期,我还需要点击两次才能进入文本框.主要问题是,一旦日历与之交互,必须在与任何其他元素交互之前单击一次.

use*_*399 17

我通过将其添加到我的SelectedDatesChanged事件来解决了这个问题:

Mouse.Capture(null);

  • 这会破坏月份导航按钮,并且在选择相同日期时不起作用。请参阅我的回答 [此处](/sf/answers/3537562451/)。 (2认同)

Roh*_*ats 9

如果您选择相同的日期,则SelectedDatesChanged不会被引发,您将看到需要单击两次的相同问题.

理想情况下,您应该挂钩GotMouseCapture事件并从原始发件人释放鼠标捕获,以避免通过日历控件捕获任何鼠标.

private void calendar_GotMouseCapture(object sender, MouseEventArgs e)
{
    UIElement originalElement = e.OriginalSource as UIElement;
    if (originalElement != null)
    {
        originalElement.ReleaseMouseCapture();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意 - 您可以通过使用其他答案中提到的附加属性来提取此行为.


Mil*_*ith 8

释放所有鼠标点击SelectedDatesChangedGotMouseCapture将破坏日历控件上月份之间的导航.正如另一个答案中所指出的,SelectedDatesChanged当选择相同的日期时不会触发.

因此GotMouseCapture,当点击的UIElement是日历日时,我使用并仅释放鼠标焦点.它解决了焦点问题,并没有打破其余的控制.

private void Calendar_GotMouseCapture(object sender, MouseEventArgs e)
{
    UIElement originalElement = e.OriginalSource as UIElement;
    if (originalElement is CalendarDayButton || originalElement is CalendarItem)
    {
        originalElement.ReleaseMouseCapture();
    }
}
Run Code Online (Sandbox Code Playgroud)


Red*_*daa 1

几周前我遇到了同样的问题,您可以使用 DatePicker,它是一个包含日历的控件,一旦用户单击按钮,日历就会显示,当您选择日期时,它会自动关闭,DatePicker 还包含一个文本框,当日期是可见的,如果需要,您可以将其设置为只读:这里是使用 DatePicker 的示例代码:

<DatePicker Name="TestDatePicker" Width="120" Height="25" >
        <DatePicker.Resources>
            <Style TargetType="DatePickerTextBox">
                <Setter Property="IsReadOnly" Value="True"></Setter>
                <Setter Property="Text" Value="Select a Date"></Setter>
            </Style>
        </DatePicker.Resources>
</DatePicker>    
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

结果 :

结果