WPFでCalendarコントロールと設定ボタンを配置して
選択した日を設定するような画面を作った時の話。
画面自体は他の人が作成していて、動作確認時に、
『日付を選択した後、設定ボタンを2回押さないと反応しない』という指摘が。
確かに確認してみたらその挙動になる。
他にも入力コントロール(テキストボックスやスピンボタン)があるが、
そちらは入力後にボタンを押下すると正しく反応するので
Calendarが悪いと判断。
個人的には日付選択はDatePickerを使うことが多かったので初体験だったけど
調べてみるとCalendarのバグらしく、ネット上でも議論が交わされていた。
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b4413872-59d0-4a06-9d20-8d21de126dc6/calendar-not-losing-focus-wpf-40?forum=wpf
結論としてはCalendarコントロールがフォーカスを握ったままになってしまうので
それを開放してあげる必要がある、ということ。
具体的な対応方法は以下のようにCalendarコントロールを配置したウィンドウクラスの
OnPreviewMouseUp() をオーバーライドし、Calendar コントロールにフォーカスがある場合は開放する。
protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
{
base.OnPreviewMouseUp(e);
if ( (Mouse.Captured is Calendar) || (Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem) )
{
Mouse.Capture(null);
}
}