Зачем ссылаться на Windows.Systrem.Форма необходима при использовании ElementHost

#c# #wpf #windows #winforms

#c# #wpf #Windows #winforms

Вопрос:

В моем проекте у меня есть приложение WPF, которое воспроизводит видео (ContentControl), оно получает видео из сторонних проектов — они возвращают элемент управления как элементы управления Winform.

Я реализовал сторонний проект, который имеет определенный элемент управления WPF (MedialElement). Поскольку проект выполняется через API, я должен вернуть элемент управления формой win, а не элемент управления wpf.

Как я решил эту проблему?
Я обернул элемент управления WPF внутри объекта ElementHost:

 MediaElement newMediaElement = new MediaElement();
newMediaElement.Source = new Uri(@SomePath");
ElementHost mediaElementWrapper = new ElementHost(); //Wrap the media element
mediaElementWrapper.Child = newMediaElement;
 

И я возвращаю mediaElementWrapper своему потребителю.

Итак, теперь в главном проигрывателе WPF я получаю этот ElementHost и делаю следующее:

 ElementHost elementHost = (ElementHost)session.PlayerControl;//PlayerControl is winform control
var extractedMediaElement = elementHost.Child as MediaElement;
elementHost.Child = null;//Disconnect the control - otherwise we get exception
return extractedMediaElement;
 

Все работает нормально!

Мой вопрос в том, почему в моем приложении для воспроизведения WPF я должен ссылаться на систему.Окна.Формы, почему ссылки на WindowsFormsIntegration и WindowsBase недостаточно?

Редактировать:

Я вижу иерархию наследования (как задокументировано): System.Windows.Формы.Система управления.Windows.Формы.Интеграция.ElementHost

Но должна ли WindowsormIntergration быть единственной сборкой, которую знают как WPF, так и winform? почему приложение WPF должно знать всю System.Form

Комментарии:

1. Он должен иметь ссылку на эту сборку именно потому ElementHost , что происходит от Control . Иначе как компилятор мог бы узнать, например, какие методы разрешены для вызова экземпляра и каковы их сигнатуры? И как среда выполнения может фактически выполнить вызов?

2. Почему нет разделения на объекты более низкого уровня? например, в одном моем проекте я взял IntPtr обработчика окна (элемента управления winform), отправил указатель на другой процесс и создал HwndHost, который ведет к этому обработчику. Таким образом, игроку не нужно знать win forms

3. Я вообще не могу разобрать этот комментарий. Ситуация довольно проста: если вы используете тип, вам нужно ссылаться на все сборки, в которых определены его основы. Вот и все.

4. Позже я покажу всем, как это делается. Специально для того, кто -1 мой вопрос. Я должен был передать IntPtr обработчику Windows Win32, затем в приложении WPF я могу управлять окнами, используя HwndSource, который указывает на этот IntPtr

Ответ №1:

Вы не можете использовать элементы управления Winform в WPF.

вы должны использовать ElementHost и добавить ссылку на System.Windows.Сборка форм.

Комментарии:

1. У меня есть способ избежать этого. Я покажу пример вечером.