1

我有一个基于 WinForms 的应用程序,其中包含传统的 MDI 实现,除了我通过 ElementHost 控件托管基于 WPF 的 UserControls 作为我每个 MDI 子项的主要内容。这是微软推荐的使用 WPF 实现 MDI 的解决方案,尽管不幸的是有各种副作用。其中之一是我的用于在每个 MDI 子项之间切换选项卡的 Ctrl+Tab 功能消失了,因为选项卡键似乎被 WPF 控件吞噬了。

是否有一个简单的解决方案可以让 Ctrl+tab 键序列到达我的 WinForms MDI 父级,以便我可以获得内置的选项卡切换功能?

4

1 回答 1

1

在宿主 WinForm 中,为宿主 WPF 控件添加一个 PreviewKeyDown 处理程序,该控件捕获 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);
        }
    }
}
于 2011-02-03T19:23:42.603 回答