代码之家  ›  专栏  ›  技术社区  ›  jpierson

如何在托管wpf用户控件时在winforms mdi应用程序中获取默认的ctrl+tab功能

  •  1
  • jpierson  · 技术社区  · 14 年前

    我有一个基于winforms的应用程序,其中包含传统的mdi实现,只是我通过elementhost控件托管基于wpf的用户控件,作为每个mdi子级的主要内容。这就是解决办法 recommended by Microsoft 虽然不幸的是有各种副作用,但是用wpf实现mdi。其中之一是,我的ctrl+tab在每个mdi子项之间切换的功能已经消失,因为tab键似乎被wpf控件吞噬了。

    有没有一个简单的解决方案可以让ctrl+tab键序列到达我的winforms mdi父级,这样我就可以获得内置的选项卡切换功能?

    1 回复  |  直到 13 年前
        1
  •  1
  •   ilves    13 年前

    在主机winform中,为宿主wpf控件添加previewkeydown处理程序,该处理程序捕获ctrl-(shift)选项卡,激活下一个或上一个mdi子项,并将事件标记为已处理:

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

    下面是下一个/prev 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);
            }
        }
    }