Jawaban saya tidak menjawab pertanyaan di atas secara langsung, namun saya merasa bahwa pengkalimatannya telah menyebabkannya menjadi "Pertanyaan" tentang menghilangkan fokus secara terprogram. Skenario umum yang memerlukan ini adalah agar pengguna dapat menghapus fokus setelah mengklik kiri latar belakang kontrol root, seperti jendela.
Jadi, untuk mencapai ini, Anda dapat membuat Attached Behavior yang akan mengalihkan fokus ke kontrol yang dibuat secara dinamis (dalam kasus saya, label kosong). Lebih disukai untuk menggunakan perilaku ini pada elemen tingkat tertinggi seperti jendela, karena ia melakukan iterasi melalui turunannya untuk menemukan panel yang dapat ditambahkan label tiruan.
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();
}
}