Пишу приложение в котором окошко ВПФ хостит АктивХ, ВинФормс и ВПФ контролы используя класс WindowsFormsHost как учит МСДН. Контролы самые тривиальные — формочки-композиты. Главное окно имеет строку меню. Происходит следующая фигня:
— устанавливаю фокус внутрь ВинФормс контрола, скажем на какой-нибудь эдит бокс;
— жму Alt-F, распахивается меню Файл
— выбираю в распахнувшемся меню любой итем и жму Enter
— меню закрывается а фокус вместо того чтобы вернуться в эдит бокс первого шага, прыгает в ВПФ контрол
Подскажите пожалуйста что делать если кто сталкивался. Хочется верить что это у меня руки кривые и я чего то простого не вижу. Ситуация дикая, потому что это центральный юз кейс любого десктопного приложение выполнять команды главного меню и сохранять фокус. Если это не работает то получается у них система интеропа просто в некондиции.
Здравствуйте, sonnesuchtige, Вы писали:
S>Доброго дня!
S>Пишу приложение в котором окошко ВПФ хостит АктивХ, ВинФормс и ВПФ контролы используя класс WindowsFormsHost как учит МСДН. Контролы самые тривиальные — формочки-композиты. Главное окно имеет строку меню. Происходит следующая фигня: S>- устанавливаю фокус внутрь ВинФормс контрола, скажем на какой-нибудь эдит бокс; S>- жму Alt-F, распахивается меню Файл S>- выбираю в распахнувшемся меню любой итем и жму Enter S>- меню закрывается а фокус вместо того чтобы вернуться в эдит бокс первого шага, прыгает в ВПФ контрол
К сожалению, помочь ничем не могу. Только лишь могу подтвердить, что у меня наблюдается то же поведение.
Для теста, я разместил в WPF-окне Menu, TextBox и WindowsFormsHost с TextBox из System.Windows.Forms.
Если лазить в меню при фокусе на WinForm'ном TextBox, то после выбора пункта меню, фокус не возвращается.
Здравствуйте, MxKazan, Вы писали:
MK>К сожалению, помочь ничем не могу. Только лишь могу подтвердить, что у меня наблюдается то же поведение. MK>Для теста, я разместил в WPF-окне Menu, TextBox и WindowsFormsHost с TextBox из System.Windows.Forms. MK>Если лазить в меню при фокусе на WinForm'ном TextBox, то после выбора пункта меню, фокус не возвращается.
Спасибо за ответ. На форуме М$ советуют в обработчике OnClick вызывать метод WindowsFormsHost.TabInto руками, что собственно подтвержает мои худшие опасения о некондиции, так как это во первых позорище, а во вторых вообще не работает. Один индус посоветовал расставить TabIndex'ы. Смеялсо. Грызу в направлении установки хука в очередь сообщений ВПФ, надежду пока не теряю.
Здравствуйте, sonnesuchtige, Вы писали:
S>На форуме М$ советуют в обработчике OnClick вызывать метод WindowsFormsHost.TabInto руками, что собственно подтвержает мои худшие опасения о некондиции, так как это во первых позорище, а во вторых вообще не работает.
Ну почему позорище Стимулируют к полному отказу от WinForms в пользу WPF
Можно, кстати, вооружившись Рефлектором, поизучать как они возвращают фокус в WPF'ный элемент.
Глядишь это позволит найти решение и в случае интеропа
Майкрософты клянуться шо все должно работать, но закрался злой баг. Решение типа такое:
public class WindowsFormsHost2 : WindowsFormsHost
{
// когда ВПФ вызывает этот метод для отработки навигационной команды надо кучками установить хосту физический фокус иначе не работает следующий методpublic override bool TabInto(TraversalRequest request)
{
Keyboard.Focus(this);
return base.TabInto(request);
}
// когда ВПФ пытается установить свой фокус... protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
// ... найти активный контрол в дереве ВинФормс и асинхронно засадить на него фокус
...
base.OnPreviewGotKeyboardFocus(e);
}
}
На простом примере работает довольно. Но не все. Если устанавливать фокус мышкой или табом — работает, но если устанавливать фокус мнемоникой типа Альт-Ц — не работает. Так же фокус теряется при переключении на другие приложения и обратно Альт-Табом. Думаю дожму.