与控件交互时,新WPF窗口中出现InvalidOperationException

时间:2016-10-11 16:38:14

标签: c# .net wpf winforms

我有一个单词加载项,可以为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)

只有当我与窗口中的控件交互时才会发生这种情况。它与任何特定控件无关,我已删除所有内容,只是在窗口中间创建并清空文本框。不过,只要我点击它,应用程序就会崩溃。

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

任何人对此事有任何想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

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