我的情况相当复杂,但我见过其他人这样做。不幸的是,没有提到我的具体问题。 我正在尝试将包含功能区的WPF UserControl集成到Win32主机应用程序中。到目前为止,一切都工作得非常好(令我惊讶的是,甚至)。我正在使用HwndSource创建一个原始的Win32子窗口并将其嵌入到Win32主机顶级窗口中。我已经尝试过TabControls,Buttons,RadioButtons,WebBrowsers以及UserControl中的所有内容,它们都可以从我的Win32主机应用程序中使用。当然,在UserControl的Grid的顶行有一个Ribbon控件。
这基本上就是我在做什么:
mHwnd = new HwndSource (
0, 0x40000000 | 0x10000000,
0,
left,
top,
width,
height,
"CIntegrationTest",
parentHandle);
mUserCtrl = new UserControl1 ();
mHwnd.RootVisual = mUserCtrl;
这很有效。 我在功能区下方的UserControl1中有一些其他控件(如编辑和几个按钮)。当键盘焦点位于其中一个控件内时,我可以使用Alt +访问RibbonTabs的KeyTips及其元素。但是当焦点不在WPF UserControl内部,而是来自Win32主机的一些控件时,热键不起作用。
我看了一下热键的实现,发现一个名为KeyTipService的类(在RibbonControlsLibrary \ Microsoft \ Windows \ Controls \ KeyTipService.cs中找到)使用InputManager.Current.PostProcessInput和InputManager.Current.PreProcessInput来处理KeyTip热键。
不幸的是,我完全没有想法如何将必要的关键事件从Win32应用程序转发到功能区。我甚至不知道如何识别需要转发的消息。
也许这里的某个人遇到了类似的问题,或者对WPF消息处理有更多线索,可以帮助我或提供一些提示。
P.S。:我在Windows XP SP3上运行Visual Studio 2010 Premium,从2010年10月开始使用Microsoft Ribbons for WPF。
答案 0 :(得分:0)
您应该能够将未处理的密钥事件从Windows窗体传递到WPF层。覆盖OnKeyDown,OnKeyUp以及您可能需要的任何其他内容。如果没有任何Form1控件处理事件,KeyEventArgs的Handled属性将为false。
然后,您可以将Forms.KeyEventArgs转换为Controls.KeyEventArgs并将其传递到WPF层。确保不要复制Handled布尔值,否则你的WPF部分根本不会处理它。 :)
我附上了一些说明这个想法的示例代码。
public partial class Form1 : System.Windows.Forms.Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
base.OnKeyDown(e);
if (!e.Handled)
{
mUserCtrl.OnKeyDown(/* convert e into a Controls.KeyEventArgs and pass it */);
}
}
}