Câu trả lời của tôi không đáp ứng trực tiếp câu hỏi trên, tuy nhiên, tôi cảm thấy rằng cách diễn đạt của nó đã khiến nó trở thành "Câu hỏi" về việc loại bỏ tiêu điểm theo chương trình. Một tình huống phổ biến khi điều này là cần thiết để người dùng có thể xóa tiêu điểm khi nhấp chuột trái vào nền của điều khiển gốc, chẳng hạn như cửa sổ.
Vì vậy, để đạt được điều này, bạn có thể tạo Hành vi đính kèm sẽ chuyển tiêu điểm sang điều khiển được tạo động (trong trường hợp của tôi là nhãn trống). Tốt hơn là sử dụng hành vi này trên các phần tử cấp cao nhất như cửa sổ, vì nó lặp qua các phần tử con của nó để tìm một bảng điều khiển mà nó có thể thêm nhãn giả vào.
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();
}
}