Есть ли способ заставить LostFocus срабатывать, когда фокус клавиатуры покидает область фокусировки? - PullRequest
0 голосов
/ 22 сентября 2011

Мое приложение динамически создает пользовательский интерфейс, в котором каждый ItemsControl в представлении является областью фокуса.Элементы, отображаемые каждым ItemsControl, являются элементами управления в его области фокусировки.Пользователь может переключаться между всеми элементами управления в представлении от начала до конца (т. Е. Режим навигации клавиатуры - Continue).Все эти элементы управления связаны со свойствами источника данных.

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

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

Это похоже на проблему, которая должна иметь простое решение, но ничто в документации не предлагает пути ее решения.Есть идеи?

1 Ответ

3 голосов
/ 25 сентября 2011

Проблема в том, что вы пытаетесь настроить логический фокус в соответствии с клавиатурным фокусом , что, как показывает документация, действительно не соответствует тому, как его предполагается использовать.Логическая фокусировка позволяет сохранить прежний элемент управления, который имел фокус в заданной области фокусировки, чтобы вы могли снова сфокусироваться на нем при восстановлении фокуса клавиатуры.

Глядя на ваш вопрос, я думаю, что вы действительно хотите сделать, это подобрать событие, когда ваш элемент управления или один из визуальных дочерних элементов теряет фокус клавиатуры.Это может быть достигнуто с помощью свойства IsKeyboardFocusedWithin , и вы можете запускать действия на основе связанного события .

Если вам нужно, чтобы это было перенаправленное событие , то вам понадобится пользовательский элемент управления, подобный следующему, который выставляет событие маршрутизации для получения и потери фокуса.1017 * которую вы можете использовать в своем XAML с записью

<local:FocusManagingControl>
        <local:FocusManagingControl.Triggers>
            <EventTrigger RoutedEvent="local:FocusManagingControl.KeyboardLostFocusWithin">                
            ....
...