Answers:
- Yes, it is possible.
- Yes, you can create them in WPF.
- The main consideration is that when using a WPF control from WinForms it needs to be wrapped in an
HwndSource
.
If you're writing a control library, it is usually best to implement your control in WPF (because it is so much more powerful than WinForms), then create a proxy for it to allow it to easily be used in WinForms.
The proxy is most easily implemented as follows:
- Derive the proxy from
System.Windows.Forms.Control
- In the proxy's constructor: instantiate your WPF control, add it to a newly constructed
HwndSource
, and add the HwndSource
as a child of your proxy
- Add properties and methods to the proxy that simply call the equivalent properties and methods of the real WPF control
Alternatively you could choose not to create a proxy, and instead just tell your WinForms users they need to put your control inside a HwndSource when they add it to their Form.
Most other issues you will encounter in creating a dual-use control are insignificant or trivial to fix. For example, if you have a feature in your control that accepts images, just design it to accept either WinForms' Bitmap or WPF's BitmapSource. And if you have a WPF control that would normally only support RoutedEvents, add old-fashioned event handlers for the comfort and convenience of the WinForms crowd.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…