4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】WPFでCalendar コントロールがフォーカスを握ったままになる問題の対策

Last updated at Posted at 2021-06-18

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);
    }
}
4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?