2010-05-29 17 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); 
     } 
    } 
} 
相關問題