WPF/WInForms Проблемы в фокусом
От: sonnesuchtige  
Дата: 07.01.09 03:07
Оценка:
Доброго дня!

Пишу приложение в котором окошко ВПФ хостит АктивХ, ВинФормс и ВПФ контролы используя класс WindowsFormsHost как учит МСДН. Контролы самые тривиальные — формочки-композиты. Главное окно имеет строку меню. Происходит следующая фигня:
— устанавливаю фокус внутрь ВинФормс контрола, скажем на какой-нибудь эдит бокс;
— жму Alt-F, распахивается меню Файл
— выбираю в распахнувшемся меню любой итем и жму Enter
— меню закрывается а фокус вместо того чтобы вернуться в эдит бокс первого шага, прыгает в ВПФ контрол

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

Спасибо.
Re: WPF/WInForms Проблемы в фокусом
От: MxKazan Португалия  
Дата: 07.01.09 23:25
Оценка:
Здравствуйте, sonnesuchtige, Вы писали:

S>Доброго дня!


S>Пишу приложение в котором окошко ВПФ хостит АктивХ, ВинФормс и ВПФ контролы используя класс WindowsFormsHost как учит МСДН. Контролы самые тривиальные — формочки-композиты. Главное окно имеет строку меню. Происходит следующая фигня:

S>- устанавливаю фокус внутрь ВинФормс контрола, скажем на какой-нибудь эдит бокс;
S>- жму Alt-F, распахивается меню Файл
S>- выбираю в распахнувшемся меню любой итем и жму Enter
S>- меню закрывается а фокус вместо того чтобы вернуться в эдит бокс первого шага, прыгает в ВПФ контрол

К сожалению, помочь ничем не могу. Только лишь могу подтвердить, что у меня наблюдается то же поведение.
Для теста, я разместил в WPF-окне Menu, TextBox и WindowsFormsHost с TextBox из System.Windows.Forms.
Если лазить в меню при фокусе на WinForm'ном TextBox, то после выбора пункта меню, фокус не возвращается.
Re[2]: WPF/WInForms Проблемы в фокусом
От: sonnesuchtige  
Дата: 08.01.09 01:44
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>К сожалению, помочь ничем не могу. Только лишь могу подтвердить, что у меня наблюдается то же поведение.

MK>Для теста, я разместил в WPF-окне Menu, TextBox и WindowsFormsHost с TextBox из System.Windows.Forms.
MK>Если лазить в меню при фокусе на WinForm'ном TextBox, то после выбора пункта меню, фокус не возвращается.

Спасибо за ответ. На форуме М$ советуют в обработчике OnClick вызывать метод WindowsFormsHost.TabInto руками, что собственно подтвержает мои худшие опасения о некондиции, так как это во первых позорище, а во вторых вообще не работает. Один индус посоветовал расставить TabIndex'ы. Смеялсо. Грызу в направлении установки хука в очередь сообщений ВПФ, надежду пока не теряю.
Re[3]: WPF/WInForms Проблемы в фокусом
От: MxKazan Португалия  
Дата: 08.01.09 02:02
Оценка:
Здравствуйте, sonnesuchtige, Вы писали:

S>На форуме М$ советуют в обработчике OnClick вызывать метод WindowsFormsHost.TabInto руками, что собственно подтвержает мои худшие опасения о некондиции, так как это во первых позорище, а во вторых вообще не работает.

Ну почему позорище Стимулируют к полному отказу от WinForms в пользу WPF

Можно, кстати, вооружившись Рефлектором, поизучать как они возвращают фокус в WPF'ный элемент.
Глядишь это позволит найти решение и в случае интеропа
Re[4]: WPF/WInForms Проблемы в фокусом
От: sonnesuchtige  
Дата: 09.01.09 04:36
Оценка:
Майкрософты клянуться шо все должно работать, но закрался злой баг. Решение типа такое:


    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);
        }
    }


На простом примере работает довольно. Но не все. Если устанавливать фокус мышкой или табом — работает, но если устанавливать фокус мнемоникой типа Альт-Ц — не работает. Так же фокус теряется при переключении на другие приложения и обратно Альт-Табом. Думаю дожму.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.