Странная проблема с фокусом с UserControl, размещенным в ElementHost

У меня есть UserControl, который находится в ElementHost.
Он содержит DataGrid
Когда пользователь нажимает клавишу ввода или дважды щелкает строку, отображается новое окно (без модального окна), и когда это окно закрывается, окно с ElementHost активируется обратно. Проблема в том, что DataGrid теряет фокус.

Snoop показал мне, что визуальное дерево имеет следующую структуру:

AdornerDecorator -> AvalonAdapter -> My UserControl.
Snoop показывает, что после активации AdornerDecorator имеет свойства

IsFocusable = false
IsFocused = false
IsKeyboardFocused = true
IsKeyboardFocusWithin = true

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

Я прочитал этот пост, и я м не доволен:

Focus работает по-разному для WPF и Windows Forms, и здесь были некоторые неровности, которые мы не смогли исправить. Если у вас есть фокус внутри WindowsFormsHost и вы либо минимизируете / восстанавливаете форму, либо показываете модальное диалоговое окно, фокус внутри WindowsFormsHost может быть потерян - WindowsFormsHost все еще имеет фокус, но элемент управления внутри него может не быть.

Что теперь? Расслабиться и быть счастливым?
И очень огорчает невозможность воспроизвести проблему в других приложениях.

Кто-нибудь может объяснить, в чем причины такого странного поведения? Может быть предложено какое-то обходное решение.


person Pavel Voronin    schedule 23.01.2013    source источник


Ответы (1)


Это известная ошибка: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7d41218e-c2bb-4957-b0b4-aa24efc4d8c2/

Но, к сожалению, ссылка на подключение мертва.

Чтобы обойти эту ошибку, мне пришлось добавить свойство IsVmFocused в мою ViewModel, а также создать мое присоединенное свойство FocusHelper.IsFocused, которое прослушивает изменение свойства IsFocused элемента и привязанное свойство виртуальной машины.
Вы можете увидеть xaml в этом (связанном с задачей) вопросе SO: Что такое кэшированный обработчик в контексте привязки данных? < / а>

person Pavel Voronin    schedule 23.01.2013