当我与控件交互时,在新的WPF窗口中出现InvalidOperationException



我有一个word插件,它将自定义工具栏添加到UI。该工具栏上有一个按钮,单击该按钮将打开一个WPF窗口。

我最近在那个窗口周围有一些奇怪的行为。当窗口打开时,只要我尝试与任何控件进行交互(即点击进入文本框开始打字,检查复选框等)。我得到许多InvalidOperationException:

************** Exception Text **************
System.InvalidOperationException: Dispatcher processing has been suspended, but messages are still being processed.
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

这只发生在我与窗口中的控件交互时。它与任何特定的控件无关,我已经删除了所有内容,只是在窗口中间创建了一个空文本框。不过,我一点击进去,应用程序就崩溃了。

现在我知道这个异常基本上告诉我,我可能正在执行一个操作,在修改可视树的过程中修改可视树(比如在可见性改变时显示消息框)。但我不会那样做的。我只是打开一个窗口,然后点击里面的控件。

有人对原因有什么想法吗?

对于感兴趣的人来说,我最终设法解决了这个问题。事实证明,wpf对话框实际上是一个带有elementhost的WindowsForms表单。在父WinForms表单中有一些代码在ElementHost的visblechanged事件上执行:

this.TopMost = true;
Application.DoEvents();
this.TopMost = false;

这是为了确保对话框在第一次显示时总是显示在顶部。一旦这段代码被删除,异常就消失了。

最新更新