私の回答は上記の質問に直接対処するものではありませんが、その言葉遣いがプログラムからフォーカスを取り除くことに関する「質問」になったと感じています。これが必要になる一般的なシナリオは、ユーザーがウィンドウなどのルートコントロールの背景を左クリックしてフォーカスをクリアできるようにすることです。
そのため、これを実現するために、動的に作成されたコントロール(私の場合は空のラベル)にフォーカスを切り替えるアタッチされた動作を作成できます。ダミーラベルを追加できるパネルを見つけるために子を反復するので、ウィンドウなどの最上位の要素でこの動作を使用することをお勧めします。
public class LoseFocusOnLeftClick : Behavior<FrameworkElement>
{
private readonly MouseBinding _leftClick;
private readonly Label _emptyControl = new Label() { Focusable = true, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top };
public LoseFocusOnLeftClick()
{
_leftClick = new MouseBinding(new RelayCommand(LoseFocus), new MouseGesture(MouseAction.LeftClick));
}
protected override void OnAttached()
{
AssociatedObject.InputBindings.Add(_leftClick);
AssociatedObject.Loaded += AssociatedObject_Loaded;
}
protected override void OnDetaching()
{
AssociatedObject.InputBindings.Remove(_leftClick);
AssociatedObject.Loaded -= AssociatedObject_Loaded;
}
private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
AssociatedObject.Loaded -= AssociatedObject_Loaded;
AttachEmptyControl();
}
private void AttachEmptyControl()
{
DependencyObject currentElement = AssociatedObject;
while (!(currentElement is Panel))
{
currentElement = VisualTreeHelper.GetChild(currentElement, 0);
}
((Panel)currentElement).Children.Add(_emptyControl);
}
private void LoseFocus()
{
_emptyControl.Focus();
}
}