Любые советы по устранению проблем с фокусировкой в ​​WPF?

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

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

6 ответов

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

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

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

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

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

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

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

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

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

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

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

Вот несколько способов начать расследование.

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

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

Другие вопросы по тегам