#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. У меня есть способ избежать этого. Я покажу пример вечером.