Cevabım yukarıdaki soruya doğrudan hitap etmiyor, ancak bu sorunun üslubunun programatik olarak odaktan kurtulma konusunda "Soru" olmasına neden olduğunu hissediyorum. Bunun gerekli olduğu yaygın bir senaryo, kullanıcının pencere gibi bir kök denetimin arka planına sol tıkladıktan sonra odağı temizleyebilmesidir.
Dolayısıyla, bunu başarmak için, odağı dinamik olarak oluşturulmuş bir kontrole (benim durumumda boş bir etiket) geçirecek bir Ekli Davranış oluşturabilirsiniz. Bu davranışı pencereler gibi en üst düzey öğelerde kullanmak tercih edilir, çünkü alt öğeleri arasında sahte bir etiket ekleyebileceği bir panel bulmak için yinelenir.
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();
}
}