C# 从模式对话框中的WindowsFormsHost控件引发异常。我怎么处理?

C# 从模式对话框中的WindowsFormsHost控件引发异常。我怎么处理?,c#,.net,wpf,C#,.net,Wpf,我正在WPF中制作一个自定义OPC客户端应用程序,以便与Kepware服务器通信。其中一个功能是配置标记,包括设置其主机和服务器。现在,我可以通过调用Kepware ClientAce API手动执行此操作,以搜索该主机上的有效网络主机和有效服务器,但ClientAce包含一个.dll,它已经提供了一个树控件,用户可以直接浏览。但是,此开箱即用控件在Windows窗体中 因此,我有一个WPF窗口,我使用ShowDialog()以模态对话框的形式启动它。此窗口中有一个WindowsFormsHos

我正在WPF中制作一个自定义OPC客户端应用程序,以便与Kepware服务器通信。其中一个功能是配置标记,包括设置其主机和服务器。现在,我可以通过调用Kepware ClientAce API手动执行此操作,以搜索该主机上的有效网络主机和有效服务器,但ClientAce包含一个.dll,它已经提供了一个树控件,用户可以直接浏览。但是,此开箱即用控件在Windows窗体中

因此,我有一个WPF窗口,我使用ShowDialog()以模态对话框的形式启动它。此窗口中有一个WindowsFormsHost元素,其中包含上述服务器浏览控件。它在大多数情况下都工作得很好,包括在用户在树控件中进行新选择时提供要处理的事件。该事件有一个布尔参数,指示新选择是否为服务器。这是一件好事,因为这正是我在这里要关注的事情

它还提供了一个“服务器被双击”事件,我处理该事件并决定将其解释为用户选择所需服务器的快捷方式。(否则,他们必须为我根据上述选择事件存储的当前选定服务器单击单独的按钮。)

到目前为止一切都很好

……但是!添加了另一个功能Kepware(实际上有一些,但我并不担心这些)。用户可以从上下文菜单中从树中删除服务器。出于某种原因,这会引发一个null异常(尽管它成功地从树中删除了服务器)。这对我来说是一件非常糟糕的事情,因为…:

  • 我不知道这是怎么回事。没有堆栈跟踪。没有额外的信息。只是那个控件中的某个地方抛出了一个未处理的异常,我现在必须处理它

  • 我无法删除关联菜单项。还有另一个上下文菜单项,我可以在XAML中设置要删除的属性,但该项不会引发异常。这是一个我不能移除的

  • 有一个可爱的事件叫做“ContextMenuItemClicked”。如果我能处理好那就太好了。我只是进入我的处理程序,在逻辑中加入一个try/catch,然后忽略与我和我试图完成的事情完全无关的null异常。然而,宇宙在这里反对我,并决定这是一个鼠标点击事件,Windows窗体不想传播。我四处搜索过,这似乎是Windows窗体和WPF互操作的常见问题。鼠标点击不能很好地使用互操作服务。我试过了。我真的做到了。但我做的处理器只是坐在那里没用。奇怪的是,虽然我可以理解为什么我可以从这个控件处理“SelectionChanged”事件,但我很好奇Kepware做了什么使“ServerDoubleClick”事件得以传播,以及为什么他们没有决定将同样的礼貌扩展到上下文菜单单击

  • 我就在这里。除了一个例外,那不是我的错,我不在乎,而且我显然无法阻止。我只想扔掉它,继续前进。但是,它在一个模态对话框中,我需要在调用ShowDialog()并首先弹出此窗口的方法之前处理此异常。(我不想告诉你为什么。这篇文章已经够冗长的了。)


    是否有一种方法可以将鼠标事件传播到窗口类中的某个位置,或者将此异常捕获到窗口类中的某个位置,这样它就不会向上传播到调用方法中?

    您无法修复或修补此问题,它发生在非您的代码中,而不是由非您的代码调用的代码中。您需要联系供应商以获得支持。一定要有一个小的repro项目来演示这个问题,如果你像这里那样请求帮助,他们很可能会忽略你。难道没有一个选项也可以捕获非托管异常吗?Hans,我担心这将是我必须采取的路线。谢谢你让我知道我已经尽力了。幸运的是,这里的工程主管告诉我,我们确实与Kepware签订了技术支持协议,因此我不必通过我们的客户获得技术支持。我意识到我将不得不以不同的方式向他们寻求帮助。因为最终,我要求他们修复他们的产品。他们不需要知道我想做什么的任何细节。我可以在一个简单的WPF应用程序窗口上用一个控件重现这个问题。