2010-07-28 2 views
9

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

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

+0

может быть так же просто, как другой щелчок произошел? это проблема пользователя или общая проблема? – kenny

ответ

0

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

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

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

0

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

0

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

0

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

Это некоторые из способов начать ваше расследование.

0

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

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

21

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

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

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

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

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

+0

Я не знаю, как это не принятый ответ. Я много лет использую Snoop и так или иначе не знал об этой функциональности. Благодаря! – thornhill

+0

Это должен быть принятый ответ, я получал орехи после того, как не смог понять, какой элемент находится в фокусе, и это сделало это за считанные секунды :) – Dreamweaver

Смежные вопросы