0 голосов
спросил от в категории WPF
События LostFocus немного отличаются в WPF, чем в Winforms, как вы понимаете. (Я вернусь со ссылкой на лучшее объяснение, которое я видел до сих пор:
LostMouseCapture="thisControl_LostMouseCapture" 
# [
private void thisControl_LostMouseCapture(object sender, MouseEventArgs e) {     if (Mouse.Captured != this)     {         if (e.OriginalSource == this)         {             if (Mouse.Captured == null || !IsDescendant(this, Mouse.Captured as DependencyObject))             {                 ClosePopup();                 return;             }         }         else if (IsDescendant(this, e.OriginalSource as DependencyObject))         {             if (PART_Popup.IsOpen && Mouse.Captured == null && GetCapture() == IntPtr.Zero)             {                 Mouse.Capture(this, CaptureMode.SubTree);                 e.Handled = true;                 return;             }         }         else         {             ClosePopup();         }     } } private void ClosePopup(bool killFocus = true) {     ResetListBoxSelection();     PART_Popup.IsOpen = false;     if(killFocus) Keyboard.Focus(null); } internal static bool IsDescendant(DependencyObject reference, DependencyObject node) {     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(reference); i++)     {         var child = VisualTreeHelper.GetChild(reference, i);         if (child == node) return true;         if (IsDescendant(child, node)) return true;         var popup = child as Popup;         if(popup != null)         {             if (IsDescendant(popup.Child, node)) return true;         }     }     return false; } public static Visual GetDescendantByType(Visual element, Type type) {     if (element == null)     {         return null;     }     if (element.GetType() == type)     {         return element;     }     Visual foundElement = null;     if (element is FrameworkElement)     {         (element as FrameworkElement).ApplyTemplate();     }     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)     {         Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;         foundElement = GetDescendantByType(visual, type);         if (foundElement != null)         {             break;         }     }     return foundElement; } [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetCapture(); private void PART_EditableTextBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {     var node = Keyboard.FocusedElement as DependencyObject;     if (node == null) return;     if (!IsDescendant(this, node)) ClosePopup(false); } 
#])
Я обнаружил, что иногда вы получаете всплывающие окна потому что нет потери фокуса, когда мышь покидает окно (или элемент управления) по разным причинам.
Вместо этого мы использовали LostMouseCapture для запуска желаемого поведения, возможно, есть что-то, что вы можете использовать из эта идея (извините, что это может быть немного запутанным, потому что у нас есть всплывающая часть списка, а не что-то, что необходимо проверить в этом элементе управления):

В UserControl xaml add это
LostMouseCapture="thisControl_LostMouseCapture" 

и в коде, который мы добавили,
private void thisControl_LostMouseCapture(object sender, MouseEventArgs e) {     if (Mouse.Captured != this)     {         if (e.OriginalSource == this)         {             if (Mouse.Captured == null || !IsDescendant(this, Mouse.Captured as DependencyObject))             {                 ClosePopup();                 return;             }         }         else if (IsDescendant(this, e.OriginalSource as DependencyObject))         {             if (PART_Popup.IsOpen && Mouse.Captured == null && GetCapture() == IntPtr.Zero)             {                 Mouse.Capture(this, CaptureMode.SubTree);                 e.Handled = true;                 return;             }         }         else         {             ClosePopup();         }     } } private void ClosePopup(bool killFocus = true) {     ResetListBoxSelection();     PART_Popup.IsOpen = false;     if(killFocus) Keyboard.Focus(null); } internal static bool IsDescendant(DependencyObject reference, DependencyObject node) {     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(reference); i++)     {         var child = VisualTreeHelper.GetChild(reference, i);         if (child == node) return true;         if (IsDescendant(child, node)) return true;         var popup = child as Popup;         if(popup != null)         {             if (IsDescendant(popup.Child, node)) return true;         }     }     return false; } public static Visual GetDescendantByType(Visual element, Type type) {     if (element == null)     {         return null;     }     if (element.GetType() == type)     {         return element;     }     Visual foundElement = null;     if (element is FrameworkElement)     {         (element as FrameworkElement).ApplyTemplate();     }     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)     {         Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;         foundElement = GetDescendantByType(visual, type);         if (foundElement != null)         {             break;         }     }     return foundElement; } [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetCapture(); private void PART_EditableTextBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {     var node = Keyboard.FocusedElement as DependencyObject;     if (node == <span c

Пожалуйста, войдите или зарегистрируйтесь чтобы ответить на этот вопрос.

Категории

Добро пожаловать на сайт DraftingCode Q&A, где вы можете задавать вопросы и получать ответы от других членов сообщества.

Связанных вопросов не найдено

...