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

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

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

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

【问题讨论】:

    标签: c# wpf winforms events event-bubbling


    【解决方案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 混合中好运)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2011-06-27
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多