Как узнать, на чем фокусируется мое приложение WPF?
У меня есть экран поиска в моем приложении WPF. Экран реализован как пользовательский элемент управления в элементе TabIont элемента TabControl. Когда пользователь переключается на вкладку "Поиск", я хочу, чтобы фокус переместился в одно конкретное поле.
Поэтому я добавил обработчик события Loaded в тег UserControl в Xaml и вызвал метод Focus элемента управления. Я хочу, чтобы начальный фокус был в обработчике события Loaded. Это прекрасно работало, пока я не обновил управляющую библиотеку Telerik, которую я использую сегодня. Теперь, когда я переключаюсь на вкладку "Поиск", фокус НЕ находится в поле, которое я хочу получить, но я не могу сказать, какой элемент управления имеет фокус.
Поле, которое я хочу сфокусировать, уже имеет обработчики событий GotFocus & LostFocus по другим причинам. Я вспомнил, что в Win Forms аргументы обработчика событий LostFocus сообщают вам, какой элемент управления получит фокус. Поэтому я установил точку останова в своем обработчике LostFocus и обнаружил, что аргументы обработчика событий LostFocus в WPF не включают эту информацию.
Как я могу выяснить, куда направлен фокус, не помещая обработчики GotFocus на каждый элемент управления в моем UserControl?
Тони
2 ответа
You can try putting your breakpoint on the LostKeyboardFocus
Attached Event instead of the LostFocus
Событие. Он использует KeyboardFocusChangedEventArgs
Class which does have properties that show which element had focus and where the focus is going.
private void textBox1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
textBox1.Text = ((FrameworkElement)e.NewFocus).Name ;
}
Попробуйте нажать клавишу Tab и посмотреть, поможет ли вам найти элемент управления в фокусе.
Вы также можете использовать Snoop, как предлагается в этом разделе "Вопросы и ответы". Какие-либо советы по устранению проблем с фокусировкой в WPF?
Для начала Snoop показывает текущий фокусированный элемент и текущий FocusScope в строке состояния.
Вы можете получить его, чтобы показать вам все события GotFocus и LostFocus:
1. Run your app. 2. Run Snoop. 3. Choose your app in the dropdown. 4. Click the binoculars ("Snoop") button. 5. On the right pane, click the Events tab. 6. Click to bring down the dropdown. 7. Scroll down to the Keyboard section and check GotKeyboardFocus, LostKeyboardFocus, and optionally the PreviewXXX events. 8. Now do what you need to do to manipulate focus and watch the Snoop window.
Точно так же вы можете отслеживать события FocusManager таким же образом.