【问题标题】:Capture Key in a WPF在 WPF 中捕获密钥
【发布时间】:2011-05-22 06:13:14
【问题描述】:

我在 WinForm 中有一个 WPF 用户控件:

绿色部分是 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

但是,结果是一样的:任何 keyUp 都被 WPF UserControl 捕获。

【问题讨论】:

    标签: .net wpf winforms keyboard


    【解决方案1】:

    只有在 ElementHost 获得焦点时才会处理这些事件。详情请见here

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

    【讨论】:

      【解决方案2】:

      这是因为 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);
      }
      

      我只需要回车键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-15
        • 2023-04-04
        • 1970-01-01
        • 2020-11-19
        • 2017-12-23
        • 1970-01-01
        • 2010-10-05
        • 2023-03-26
        相关资源
        最近更新 更多