Winforms 中的 WPF 事件

Posted

技术标签:

【中文标题】Winforms 中的 WPF 事件【英文标题】:WPF Events in Winforms 【发布时间】:2011-05-20 01:10:04 【问题描述】:

我有一个 Winforms 应用程序,该应用程序在 ElementHost 中使用 WPF 控件(如果重要,则为 Avalon Edit)。

它似乎工作正常,但我希望能够以 Winforms 方式处理此控件的 KeyPress 事件(没有 RoutedCommands 和 InputGestures),所以我虽然可以只处理设置了 KeyPreview 的 Form 的 KeyDown 事件,但 WPF 事件似乎并没有出现在表单中。

那么基本上,如何以 Winforms 方式访问 WPF 控件上的 KeyDown 事件?

【问题讨论】:

【参考方案1】:

您可以尝试为 WpfControl 本身添加自定义事件处理程序,而不是尝试连接到 WinForm 的 KeyDown。

这是一个例子。假设:您的 WinForm 是 Form1 类型,WpfControl 是 UserControl1,并且 WpfControl 的元素宿主被调用(永远不会猜到)- elementHost。

public Form1()

    InitializeComponent();
    elementHost.ChildChanged += ElementHost_ChildChanged;


private void ElementHost_ChildChanged(object sender, ChildChangedEventArgs e)

    var ctr = (elementHost.Child as UserControl1);
    if (ctr == null)
        return;
    ctr.KeyDown += ctr_KeyDown;


void ctr_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)

    /* your custom handling for key-presses */

UPD:e.KeyboardDevice.Modifiers(e 是System.Windows.Input.KeyEventArgs)存储有关 Ctrl、Alt 等的信息。

【讨论】:

问题是 System.Windows.Input.KeyEventArgs 实际上并没有暴露修饰键,所以你不能检查'Ctrl+Z',只能检查'Z'或'Ctrl'。就我所见,即使 Key 属性也不是修饰符和键的按位组合,它只是按下的主键。 @Miguel,查看更新:e.KeyboardDevice.Modifiers 是您所需要的。 哦,谢谢你,我永远不会解决这个问题。赞成。 祝你在 WPF 和 WF 混合中好运)

以上是关于Winforms 中的 WPF 事件的主要内容,如果未能解决你的问题,请参考以下文章

从 WinForms 拖放到 WPF 问题

WinForms中的WPF控件[关闭]

WinForms 互操作,从 WinForms 拖放 -> WPF

检测是不是在 WPF 和 Winforms 中的 UI 线程上

WPF 图像的单击事件

为啥 WPF 中的鼠标位置不正确,而缩放桌面上的 Winforms 则不正确?