2010-08-30 46 views
5

好吧,我不知道我理解這應該如何工作,但在我的應用程序中,我綁定了一個關鍵手勢(Ctrl + K)到RoutedCommand。無論我在哪裏關注我的應用程序,該鍵組合都可以工作,除非我在包含Web瀏覽器控件的WindowsFormsHost中使用它。我嘗試捕獲Web瀏覽器控件的PreviewKeyDown事件並將IsInputKey設置爲false。理論上,這應該使主持人考慮未處理的關鍵手勢並向上發送,但這不會發生。WPF WindowsFormsHost不會冒泡未處理的關鍵手勢

UPDATE:

如果我重寫控件的布爾IsInputKey(鍵KEYDATA)並返回false,它的工作原理和命令獲取,因爲它應該執行。

也許我處理PreviewKeyDown的方式有問題嗎?

private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e) 
{ 
    e.IsInputKey = false; 
} 

我希望這可以讓我從我的主窗口捕獲任何組合鍵。我寧願解決這個事件處理比擴展控件...

回答

0

如果我正確地理解它,你想防止按鍵託管Winform處理。但是,您的示例代碼表明您嘗試在託管控件中處理它。

爲了處理隧道事件,您最好在WPF可視化樹中的「外部」託管控件處理它。你可以 - - 舉例如下處理:

<Grid PreviewKeyDown="Grid_PreviewKeyDown" PreviewMouseDown="Grid_PreviewMouseDown" Height="250" Width="250"> 
    <WindowsFormsHost Name="windowsFormsHost1"> 
     <wf:Form1 TopLevel="False" /> 
    </WindowsFormsHost> 
</Grid> 

通過設置事件的處理方式如下所示,它可以防止該事件被進一步向下傳播的可視化樹:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = true; 
}