从WinForms打开WPF窗口时的奇怪行为

时间:2017-10-26 12:06:47

标签: c# wpf excel winforms office-interop

当从Excel插件显示WPF窗口时,每当我使用myWindow.Show()而不是myWindow.ShowDialog()显示时,我都会遇到奇怪的行为。到目前为止,使用后者时一切都运行良好。但是,能够显示一个窗口以便用户可以同时与Excel交互(即我期望从Show()开始的行为,这将是很好的。

问题在于,我的表单中的控件很快就开始表现得非常奇怪。 ComboBox下拉列表会立即崩溃,文本框输入会在Excel工作表中处于活动状态的任何单元格中结束。

我注意到使用ShowDialog,Snoop也可以附加到我的窗口,而使用Show,我得到的错误相当于“无法找到要附加的PresentationSource”。但是,我并不完全确定这是否相关。

显然,一种解决方案是停止直接从WinForms显示WPF窗口;如果我将窗口更改为UserControl并将其放入ElementHost,我希望问题基本消失。但是,如果可以,我宁愿避免这样做。

当前代码(大致)

public void DoOpenWindow(Office.IRibbonControl button)
{
    var myWindow = new myWindow();
    // This hasn't addressed the issue, though may be sensible to include:
    //ElementHost.EnableModelessKeyboardInterop(myWindow);

    // This *also* didn't work, and essentially set my window to 
    // be always on top of Excel
    //var hwSrc = HwndSource.FromVisual(myWindow );
    //var ownerHelper = new WindowInteropHelper(myWindow );
    //ownerHelper.Owner = (IntPtr)Globals.ThisAddIn.Application.Hwnd;

    // with ShowDialog() this works fine...
    myWindow .Show();
}

目前的想法是:

  • 我正在将Excel中的窗口消息转发到myWindow,其中一些是不期望的。
  • Excel拦截了用于我的窗口(键盘和鼠标)的消息,这可能 ElementHost.EnableModelessKeyboardInterop(myWindow)旨在解决的问题(但是我使用的是错误的,或者它不是整个解决方案)。

0 个答案:

没有答案