Как получить функциональность Ctrl + Tab по умолчанию в приложении WinForms MDI при размещении пользовательских элементов управления WPF

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

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


person jpierson    schedule 29.05.2010    source источник


Ответы (1)


В хост-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);
        }
    }
}
person ilves    schedule 03.02.2011