मेरा उत्तर सीधे ऊपर के प्रश्न को स्वीकार नहीं करता है, हालाँकि, मुझे लगता है कि इसका शब्दांकन इसके कारण "द क्वेश्चन" बन गया है, जो प्रोग्रामेटिक रूप से फ़ोकस से छुटकारा दिलाता है। एक सामान्य परिदृश्य जहां इसकी आवश्यकता होती है, उपयोगकर्ता के लिए विंडो की तरह रूट कंट्रोल की पृष्ठभूमि पर क्लिक करने पर ध्यान केंद्रित करने में सक्षम होना चाहिए।
तो, इसे प्राप्त करने के लिए, आप एक संलग्न व्यवहार बना सकते हैं जो ध्यान को गतिशील रूप से बनाए गए नियंत्रण (मेरे मामले में, एक खाली लेबल) पर स्विच करेगा। खिड़कियों जैसे उच्चतम-स्तरीय तत्वों पर इस व्यवहार का उपयोग करना बेहतर है, क्योंकि यह बच्चों के माध्यम से पुनरावृत्ति करता है कि यह एक पैनल खोजने के लिए एक डमी लेबल जोड़ सकता है।
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();
}
}