2010-12-08 191 views
1

我有一個WPF用戶控件在一個WinForm:拍攝鍵

alt text

綠色的部分是WPF用戶控件..

的用戶控件代碼波紋管:

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPreviewKeyUp(KeyEventArgs e) 
    { 
     base.OnPreviewKeyUp(e); 
     MessageBox.Show(e.Key.ToString()); 
    } 
} 

XAML:

<UserControl> 
    <Grid Background="DarkGreen"> 
     <Label Content="Label" Margin="64,105,0,0" Name="label1" /> 
    </Grid> 
</UserControl> 

每次打開tabPage2我都需要「聽」鍵盤命令。

實際的代碼不起作用(打開tabPage2時按下鍵盤時的任何消息)。

爲什麼?

EDIT 1

更新一些的WinForms代碼:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (this.tabControl1.SelectedIndex == 1) 
     { 
      ElementHost elHost = (this.tabControl1.SelectedTab.Controls[0] as ElementHost); 
      bool success = false; 
      if (elHost != null) 
      { 
       success = elHost.Focus(); 
       Console.WriteLine("Success : {0}", success); 
      }     
     } 
    } 

結果:

Function: WindowsFormsApplication2.Form1.tabPage2_Enter 
Function: WindowsFormsApplication2.Form1.tabControl1_SelectedIndexChanged 
Success : True 

但是,結果是相同的:任何使用keyUp由WPF捕獲用戶控件。

回答

1

事件僅在ElementHost具有焦點時處理。詳情請參閱here

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    (this.tabControl1.SelectedTab.Controls[0] as ElementHost).Focus(); 
} 
0

發生這種情況是因爲WinForms和WPF之間的消息傳遞不同。

這是我爲此提出的解決方案。

在你的WinForms控制聽取WPF控件的關鍵事件

_wpfHost.Child = MyWpfControl; 
MyWpfControl.Name = "MyWpfControl"; 

this.MyWpfControl.PreviewKeyDown += WpfControlOnPreviewKeyDown; 

WpfControlOnPreviewKeyDown做你的邏輯。我必須將事件冒泡到另一個需要鍵盤事件的WinForms控件。

private void WpfControlOnPreviewKeyDown(object sender, KeyEventArgs args) 
{ 
    if (args.Key != System.Windows.Input.Key.Enter) return; 

    // bubble up the event 
    var message = new System.Windows.Forms.Message { WParam = (IntPtr)Keys.Enter }; 
    this.ProcessKeyPreview(ref message); 
} 

我只需要輸入密鑰。