2010-09-07 148 views
1

我正试图在WPF应用程序中托管一个ActiveX控件。尝试在网络上使用现有信息并在此处尝试后,我遇到了一个死胡同。在WPF中使用ActiveX控件

我需要使用提供的ActiveX控件来与UV power meter进行通信。他们提供了一个登录并使用该控件的application,甚至包括一些有用的演示应用程序。我删除了OCX文件,并在需要时输入here。您将不会有功率计进行通话,但应用程序和演示仍将成功加载ActiveX控件。

我创建了一个简单的Windows窗体应用程序。我能够将ActiveX控件带入工具栏,将它放到我的表单中,并且一切都很好。他们提供的演示应用也是如此。

但是,让它在WPF环境中工作是另一回事。该控件无法添加到工具箱并“拖动”到应用程序中。

到目前为止,我已经尝试了两种技术:

  1. 技术发现here。我可以添加对控件的引用,但是接下来我输入命名空间地狱。它建议使用的xmlns:ax命名空间找不到信息。以下是我基于对象查看器告诉我的内容的尝试:xmlns:ax="clr-namespace:OphirUsbXLib;assembly=Interop.OphirUsbXLib"
  2. 找到的技巧here。这基本上是创建一个新的项目,创建一个基于Windows窗体,其中包含ActiveX控件(yikes)的库。我可以添加Windows窗体主机,但我无法访问其中的ActiveX控件。我可以将控件公开,但我仍然不能调用方法等。这看起来不是正确的解决方案。

总之,我有一个ActiveX控件,在Forms中工作得很漂亮,但是在WPF中工作起来却是一个婊子。

任何见识都被赞赏!

回答

2

在这种情况下,我会考虑制作一个WinForms用户控件,它封装了您正在尝试使用的ActiveX控件。

您可以制作公开属性和方法,以暴露ActiveX控件上的每个必需属性和方法,然后将此WinForms UC托管在WPF WinFormsHost控件中。

我已经做了类似的事情,反过来,在WinForms UserControl中托管一个WPF UserControl,然后在一个遗留应用程序的VB6 Form上托管它。

+0

我认为你所描述的将会起作用(第二种方法),但是要编写新的访问方法来获得ActiveX控件,看起来很痛苦。假设该控件有50个方法,例如,需要编写50个基本上“通过”控件的新方法。我希望有更好的方法。 – BabaBooey 2010-09-08 01:43:24

+1

采取实用的方法,只公开从WPF应用程序中实际需要使用的方法和属性 – benPearce 2010-09-08 02:49:52