我在WPF中创建一个自定义OPC客户端应用程序,以便与Kepware服务器通信。其中一个功能是配置标签,包括设置它的主机和服务器。现在,我可以通过调用Kepware ClientAce API手动执行此操作,以搜索该主机上的有效网络主机和有效服务器,但ClientAce包含一个已提供树控件的.dll,用户可以直接浏览。但是,这种开箱即用的控件是在Windows窗体中。
所以我有这个WPF窗口,我使用ShowDialog()作为模态对话框启动。在此窗口中是一个WindowsFormsHost元素,其中包含上述服务器浏览控件。它在大多数情况下都能很好地工作,包括提供一个事件来处理用户在树控件中进行新选择的时间。该事件有一个布尔参数,指示新选择是否是服务器。这是一件好事,因为我正在努力追踪这里。
它还提供了一个"服务器已被双击"事件,我处理并决定将其解释为用户选择该服务器作为他们想要的服务器的快捷方式。 (否则,他们必须根据上述选择事件单击我存储的当前所选服务器的单独按钮。)
到目前为止一切都很好....
...但是! Kepware增加了另一项功能(实际上还有一些功能,但我现在并不担心这些功能)。用户可以从上下文菜单中删除树中的服务器。出于某种原因,这会抛出一个空异常(但是,它成功地从树中删除了服务器)。这对我的目的来说非常糟糕,因为......:
我不知道是什么导致了这一点。没有堆栈跟踪。没有额外的信息。只是那个东西,在那个控件的某个地方抛出了一个未处理的异常,我现在必须处理它。
我无法删除上下文菜单项。还有另一个上下文菜单项,我可以在XAML中设置一个属性来删除,但是那个不能抛出异常。它是我无法删除的那个。
这是一个名为" ContextMenuItemClicked"的可爱事件。如果我能处理它,那就太好了。我只是进入我的处理程序,对逻辑进行try / catch,并忽略与我完全无关的空异常以及我想要完成的事情。然而,宇宙在这里反对我,并且已经决定这是一个鼠标点击事件,Windows Forms并不想传播。我已经四处搜索过,这似乎是Windows Forms和WPF互操作的常见问题。鼠标点击只是不适合互操作服务。我试过了。我真的做到了。但我制作的处理程序只是未使用。奇怪的是,虽然我能理解为什么我可以处理" SelectionChanged"来自这个控件的事件,我很好奇Kepware做了什么来实现" ServerDoubleClick"事件传播,以及为什么他们没有决定将相同的礼貌扩展到上下文菜单点击。
所以我就是这样。除了我的错,我并不关心,我显然无法阻止。我只是想扔掉它继续前进。但是,它在模式对话框中,我需要在调用ShowDialog()的方法之前处理此异常并首先弹出此窗口。 (我会给你一些关于原因的详细信息。这篇文章已经足够啰嗦了。)
有没有办法可以以某种方式传播鼠标事件,或者在我的窗口类中的某个地方捕获此异常,以便它不会将堆栈传播到调用方法中?