Windows窗体中的WPF控件?

我想创建一些适用于WPF和Windows窗体的自定义UI控件。

这可能吗?

如果是这样,我可以在WPF中创建这些控件,还是需要使用Windows窗体控件?

还有其他考虑因素吗?

回答:

  1. 对的,这是可能的。
  2. 是的,您可以在WPF中创建它们。
  3. 主要考虑因素是当从WinForms使用WPF控件时,它需要包装在HwndSource

如果你正在编写一个控件库,通常最好在WPF中实现你的控件(因为它比WinForms强大得多),然后为它创建一个代理,以便在WinForms中轻松使用它。

代理最容易实现如下:

  1. System.Windows.Forms.Control派生代理
  2. 在代理的构造函数中:实例化您的WPF控件,将其添加到新构造的HwndSource ,并将HwndSource添加为您的代理的子代
  3. 向代理添加属性和方法,只需调用实际WPF控件的等效属性和方法

或者,您可以选择不创建代理,而只是告诉您的WinForms用户,当他们将控件添加到他们的表单时,他们需要将您的控件放在HwndSource中。

您在创建双重用途控件时遇到的大多数其他问题都无法解决或无关紧要。 例如,如果您的控件中有一个接受图像的function,只需将其设计为接受WinForms的Bitmap或WPF的BitmapSource。 如果你有一个通常只支持RoutedEvents的WPF控件,添加老式的事件处理程序,以便WinForms人群的舒适和方便。

ElementHost将允许您在WinForms表单中嵌入WPF控件, WindowsFormsHost允许您将WinForms控件插入到WPF窗口中。

两者都易于使用,并且两者都有很小的组合问题(你不能在WinForms元素上绘制WPF元素等)。