Как получить функциональность Ctrl + Tab по умолчанию в приложении WinForms MDI при размещении WPF UserControls - PullRequest
1 голос
/ 29 мая 2010

У меня есть приложение на основе WinForms с традиционной реализацией MDI, за исключением того, что я размещаю пользовательские элементы управления на основе WPF через элемент управления ElementHost в качестве основного контента для каждого из моих дочерних элементов MDI. Это решение , рекомендованное Microsoft для достижения MDI с WPF, хотя, к сожалению, существуют различные побочные эффекты. Одна из них заключается в том, что моя функциональность Ctrl + Tab для переключения табуляции между каждым дочерним MDI отсутствует, потому что клавиша tab кажется поглощенной элементами управления WPF.

Существует ли простое решение для этого, которое позволит последовательности клавиш Ctrl + Tab достигать моего родителя WinForms MDI, чтобы я мог получить встроенную функциональность переключения вкладок?

1 Ответ

1 голос
/ 03 февраля 2011

В хосте WinForm добавьте обработчик PreviewKeyDown для размещенного элемента управления WPF, который захватывает Ctrl- (Shift) -Tab, активирует следующий или предыдущий дочерний элемент MDI и помечает событие как обработанное:

TheHostedWpfControl.PreviewKeyDown += (s, e) =>
{
    if (e.Key == Key.Tab && ModifierKeys.HasFlag(Keys.Control))
    {
        ActivateNextMdiChild(ModifierKeys.HasFlag(Keys.Shift));
        e.Handled = true;
    }
};

ИВот следующая / предыдущая активация ребенка MDI:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, int lParam);

private const int WM_MDINEXT = 0x224;

private void ActivateNextMdiChild(bool backward = false)
{
    if (MdiParent != null)
    {
        MdiClient mdiClient = MdiParent.Controls.OfType<MdiClient>().FirstOrDefault();
        if (mdiClient != null)
        {
            SendMessage(mdiClient.Handle, WM_MDINEXT, Handle, backward ? 1 : 0);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...