Ответы:
- Да, это возможно.
- Да, вы можете создавать их в WPF.
- Основное соображение заключается в том, что при использовании элемента управления WPF из WinForms его необходимо заключить в
HwndSource
.
Если вы пишете библиотеку элементов управления, обычно лучше реализовать свой элемент управления в WPF (поскольку он намного мощнее, чем WinForms), а затем создать для него прокси-сервер, чтобы его можно было легко использовать в WinForms.
Прокси проще всего реализовать следующим образом:
- Извлечь прокси из
System.Windows.Forms.Control
- В конструкторе прокси: создайте экземпляр своего элемента управления WPF, добавьте его к недавно созданному
HwndSource
и добавьте HwndSource
в качестве дочернего элемента прокси
- Добавление свойств и методов в прокси, которые просто вызывают эквивалентные свойства и методы реального элемента управления WPF
В качестве альтернативы вы можете отказаться от создания прокси-сервера, а вместо этого просто сказать своим пользователям WinForms, что им нужно поместить ваш элемент управления в HwndSource, когда они добавят его в свою форму.
Большинство других проблем, с которыми вы столкнетесь при создании элемента управления двойного назначения, несущественно или тривиально исправить. Например, если в вашем элементе управления есть функция, которая принимает изображения, просто спроектируйте ее так, чтобы она принимала либо Bitmap WinForms, либо BitmapSource WPF. И если у вас есть элемент управления WPF, который обычно поддерживает только RoutedEvents, добавьте старомодные обработчики событий для удобства и удобства толпы WinForms.