Любые советы по устранению проблем с фокусировкой в WPF?
В частности, у меня есть кнопка, которая открывает немодальное дочернее окно. Что-то в главном окне скрывает фокус от дочернего окна при его открытии.
Полностью общий подход состоит в том, чтобы закомментировать части кода, пока проблема не исчезнет. Я ищу более быстрые методы.
6 ответов
Я использую Snoop, чтобы сделать это прямо сейчас.
Для начала Snoop показывает текущий фокусированный элемент и текущий FocusScope в строке состояния.
Вы можете получить его, чтобы показать вам все события GotFocus и LostFocus:
- Запустите ваше приложение.
- Запустите Snoop.
- Выберите ваше приложение в раскрывающемся списке.
- Нажмите кнопку бинокля ("Снуп").
- На правой панели перейдите на вкладку События.
- Нажмите, чтобы открыть раскрывающийся список.
- Прокрутите вниз до раздела "Клавиатура" и выберите "GotKeyboardFocus", "LostKeyboardFocus" и, при необходимости, события "PreviewXXX".
- Теперь сделайте то, что вам нужно, чтобы управлять фокусом и наблюдать за окном 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.,
Не могли бы вы упомянуть основные операции (не вдаваясь в специфику клиента - если это клиентский проект) - например, есть ли какие-либо события, связанные с элементами, Любая другая операция, происходящая при нажатии кнопки - Все, что происходит для любого элемента в родительское окно показывается после дочернего окна, которое крадет фокус. Также проверьте все связанные события, которые произошли во время события нажатия кнопки.
Вот несколько способов начать расследование.
Вы можете попытаться отследить вызовы к методу System.Window.UIElement.Focus (в PresentationCore.dll) в контексте вашего приложения, используя Runtime Flow (разработанный мной).