编辑2:谢谢大家的反馈.我通过将其添加到我的SelectedDatesChanged事件来解决了这个问题:
Mouse.Capture(null);
当我在日历中选择日期时,我想点击"开始"按钮.但是,我需要点击两次"开始"按钮:一次取消对焦日历,再次实际按下它.如果在其中选择了一个项目,则鼠标离开事件不会在日历上触发,并且Keyboard.ClearFocus()也不会对其进行去焦点.
请问,每当我选择日期时,如何摆脱日历的焦点?谢谢!
编辑:接下来单击"开始"按钮仅仅是一个例子; 如果我想选择一个文本框而我刚刚选择了一个日期,我还需要点击两次才能进入文本框.主要问题是,一旦日历与之交互,必须在与任何其他元素交互之前单击一次.
use*_*399 17
我通过将其添加到我的SelectedDatesChanged事件来解决了这个问题:
Mouse.Capture(null);
如果您选择相同的日期,则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)
注意 - 您可以通过使用其他答案中提到的附加属性来提取此行为.
释放所有鼠标点击SelectedDatesChanged或GotMouseCapture将破坏日历控件上月份之间的导航.正如另一个答案中所指出的,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)
几周前我遇到了同样的问题,您可以使用 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)
希望这可以帮助。
结果 :
