エンターキーが押されたらフォーカスを解除する等の処理の実装時、少しハマったので書いておく。
コントロールにcontrol.UnFocus()
的なメソッドがあればよいのだが、残念ながらそのようなものはなかった。
まず、これを実装するために初めに思いつくのはKeyboard.ClearFocus()
を使うことだが、これだとコントロールのLostFocus
が呼ばれない。
では、どうするのかというと答えは単純である。
別のコントロールにフォーカスを当てればよい。
ただ、プログラムごとに特定のコントロールにフォーカスを当てる処理を書くのは個人的にスマートではないので、一般化しておく。
コード例を以下に示す。
Sample.cs
// コントロールのフォーカスを解除する
public void BreakFocus(Control control){
DependencyObject ancestor = control.Parent;
while (ancestor != null)
{
// フォーカスできるか
if (ancestor is UIElement element && element.Focusable)
{
element.Focus(); // フォーカスを当てる
break;
}
ancestor = VisualTreeHelper.GetParent(ancestor);
}
}
非常に単純である。フォーカス可能なコントロールが見つかるまでさかのぼって、当ててやるだけである。
これでコントロールのアンフォーカスが実装できた。