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 互操作,从 WinForms 拖放 -> WPF