Syl*_*ain 10 wpf winforms-interop winforms
我们有一个WinForms应用程序,我们正在逐步转换为WPF.此时应用程序的主窗体是一个Form(WinForm),它包含一个用WPF构建的垂直侧边栏.侧栏托管在ElementHost控件中.
在主窗体中,KeyPreview设置为true,我们重写OnKeyDown()以处理应用程序范围的键盘快捷方式.当侧边栏具有焦点时,键盘事件不会发送到OnKeyDown.
解决这个问题的正确方法是什么?
是的,似乎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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1785 次 |
最近记录: |