在WPF中捕获密钥

时间:2010-12-08 14:01:23

标签: .net wpf winforms keyboard

我在WinForm中有一个WPF UserControl:

alt text

绿色部分是WPF UserControl ..

UserControl代码如下:

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打开的情况下按键盘时会显示任何消息)。

为什么?

编辑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

但是,结果是相同的:WPF UserControl捕获任何keyUp。

2 个答案:

答案 0 :(得分:1)

仅在ElementHost具有焦点时处理事件。有关详细信息,请参阅here

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

答案 1 :(得分: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);
}

我只需要输入密钥。