คำตอบของฉันไม่ได้ตอบคำถามข้างต้นโดยตรง แต่ฉันรู้สึกว่าถ้อยคำของคำถามนี้ทำให้กลายเป็น "คำถาม" เกี่ยวกับการกำจัดโฟกัสโดยใช้โปรแกรม สถานการณ์ทั่วไปที่จำเป็นเพื่อให้ผู้ใช้สามารถล้างโฟกัสได้เมื่อคลิกซ้ายที่พื้นหลังของตัวควบคุมรูทเช่นหน้าต่าง
ดังนั้นเพื่อให้บรรลุสิ่งนี้คุณสามารถสร้าง 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();
}
}