Любые советы по устранению проблем с фокусировкой в ​​WPF? - PullRequest
11 голосов
/ 28 июля 2010

В частности, у меня есть кнопка, которая открывает немодальное дочернее окно.Что-то в главном окне скрывает фокус от дочернего окна при его открытии.

Полностью общий подход состоит в том, чтобы закомментировать части кода, пока проблема не исчезнет.Я ищу более быстрые методы.

Ответы [ 6 ]

25 голосов
/ 05 января 2011

Я использую Snoop , чтобы сделать это прямо сейчас.

Для начала Snoop показывает текущий фокусированный элемент и текущий FocusScope в строке состояния.

Вы можете получить его, чтобы показать вам все события GotFocus и LostFocus:

  1. Запустите приложение.
  2. Запустите Snoop.
  3. Выберите приложение в раскрывающемся списке.
  4. Нажмите кнопку бинокля ("Snoop").
  5. На правой панели откройте вкладку «События».
  6. Нажмите, чтобы открыть раскрывающийся список.
  7. Прокрутите вниз до раздела «Клавиатура» и выберите GotKeyboardFocus, LostKeyboardFocus и, при необходимости, события PreviewXXX.
  8. Теперь сделайте то, что вам нужно, чтобы управлять фокусом и наблюдать за окном Snoop.

Аналогичным образом вы можете отслеживать события FocusManager таким же образом.

0 голосов
/ 30 июля 2010

Я только что прочитал о некотором тупике ... надеюсь, это поможет (найдите control.leave в msdn.microwoft.com

Внимание! Не пытайтесь установить фокус изнутри Enter, GotFocus, Leave, LostFocus, Проверка или Проверка обработчиков событий. Это может привести к тому, что ваше приложение или операционная система перестанут отвечать. Дополнительные сведения см. В разделе WM_KILLFOCUS в разделе «Справочник по вводу с клавиатуры» и в разделе «Блокировка сообщений» в разделе «О программе».Сообщения и очереди сообщений »в библиотеке MSDN по адресу http://msdn.microsoft.com/library.

0 голосов
/ 29 июля 2010

Не могли бы вы упомянуть основные операции (не вдаваясь в специфику клиента - если это клиентский проект) - например, есть ли какие-либо события, связанные с элементами, Любая другая операция, происходящая при нажатии кнопки - Все, что происходит длялюбой элемент в родительском окне после дочернего окна, который крадет фокус.Также проверьте все связанные события, которые произошли во время события нажатия кнопки.

Вот некоторые из способов, которыми вы можете начать свое расследование.

0 голосов
/ 29 июля 2010

Вы можете попытаться отследить вызовы метода System.Window.UIElement.Focus (в PresentationCore.dll) в контексте вашего приложения, используя Поток времени выполнения (разработанный мной).

0 голосов
/ 29 июля 2010

Вы можете попробовать использовать такой инструмент, как UI Spy или Snoop , чтобы отслеживать событие, которое меняет фокус. Я не использовал эти инструменты для этой цели, но я верю, что они могут вам помочь.

0 голосов
/ 28 июля 2010

Я сам не пробовал, поэтому не могу сказать точные шаги, но вы можете попробовать использовать FocusManager.FocusedElement и FocusManager.GetFocusedElement Метод , чтобы попытаться найти элемент красть фокус из окна вашего ребенка.

Другая полезная ссылка -

Обзор фокуса (есть код для получения сфокусированный элемент): http://msdn.microsoft.com/en-us/library/aa969768.aspx#Focus_Events

...