10

我们有一个 WinForms 应用程序,正在逐步转换为 WPF。此时应用程序的主窗体是一个窗体 (WinForm),其中包含 WPF 中内置的垂直侧边栏。侧边栏托管在 ElementHost 控件中。

在主窗体中,KeyPreview 设置为 true,我们重写 OnKeyDown() 以处理应用程序范围的键盘快捷键。当侧边栏获得焦点时,键盘事件不会发送到 OnKeyDown。

解决此问题的正确方法是什么?

4

1 回答 1

8

是的,ElementHost 似乎没有考虑 KeyPreview,这是一种解决方法:

派生自 ElementHost 并覆盖 ProcessCmdKey,当 base.ProcessCmdKey 结果显示“未处理”时,即使它不是您的主窗体,也将消息传递给父级,这样您的主窗体将接收它,因为其他 winforms 控件将正常运行。这是一个示例...

public class KeyPreviewEnabledElementHost : ElementHost
{
    public KeyPreviewEnabledElementHost()
    {
    }

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message m, System.Windows.Forms.Keys keyData)
    {
        bool processed = base.ProcessCmdKey(ref m, keyData);

        if (!processed)
        {
            SendMessage(Parent.Handle, m.Msg, m.WParam, m.LParam);
        }

        return processed;
    }
}
于 2011-05-04T19:17:40.933 回答