내 대답은 위의 질문을 직접적으로 다루지는 않지만 그 표현이 프로그래밍 방식으로 초점을 없애는 것에 대한 "The Question"이되게 한 것 같습니다. 이것이 필요한 일반적인 시나리오는 사용자가 창과 같은 루트 컨트롤의 배경을 마우스 왼쪽 버튼으로 클릭하여 포커스를 지울 수 있도록하는 것입니다.
따라서이를 달성하기 위해 동적으로 생성 된 컨트롤 (제 경우에는 빈 레이블)로 포커스를 전환하는 Attached Behavior를 만들 수 있습니다. 더미 레이블을 추가 할 수있는 패널을 찾기 위해 하위 항목을 반복하므로 창과 같은 최상위 요소에서이 동작을 사용하는 것이 좋습니다.
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();
}
}