2010-05-29 77 views
1

我有一个WinForms基于应用程序,除了用在它传统的MDI实现,我通过ElementHost控件为每个主要内容托管基于WPF用户控件我的MDI孩子。这是用于通过WPF实现MDI的解决方案recommended by Microsoft,但不幸的是存在各种副作用。其中之一就是我的Ctrl + Tab功能可以用于每个MDI子项之间的制表符切换,因为Tab键似乎被WPF控件吞噬了。如何托管WPF用户控件时,得到的WinForms MDI应用程序默认为Ctrl + Tab键的功能

有一个简单的解决方案,这将让CTRL + TAB键序列达到我的WinForms MDI父,这样我可以得到内置选项卡切换功能?

回答

1

在主机的WinForm添加PreviewKeyDown处理程序捕获按Ctrl - (SHIFT)-Tab托管WPF控件,激活下一个或上一个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); 
     } 
    } 
} 
相关问题