【发布时间】:2014-06-26 08:53:04
【问题描述】:
在我的项目中,我有播放视频 (ContentControl) 的 WPF 应用程序,它接收来自第三方项目的视频 - 它们将控件作为 Winform 控件返回。
我实现了一个具有特定 WPF 控件 (MedialElement) 的第 3 方项目。 由于该项目是通过 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 Play 应用程序中我必须引用 System.Windowns.Forms,为什么对 WindowsFormsIntegration 和 WindowsBase 的引用还不够?
编辑:
我看到了继承层次结构 (as documented): System.Windows.Forms.Control System.Windows.Forms.Integration.ElementHost
但是 WindowsormIntergration 应该是 WPF 和 winform 都知道的唯一程序集吗?为什么 WPF 应用程序需要知道整个 System.Form
【问题讨论】:
-
它需要引用该程序集,因为
ElementHost派生自Control。否则编译器怎么会知道例如哪些方法可以合法地调用实例,它们的签名是什么?运行时如何实际进行调用? -
为什么没有对低级对象进行分离?例如,在我的一个项目中,我获取了窗口处理程序(winform 控件)的 IntPtr,将指针发送到另一个进程,并创建了一个直接指向该处理程序的 HwndHost。这样玩家就不需要知道获胜形式
-
我根本无法解析该评论。情况相当简单:如果使用类型,则需要引用定义其基的所有程序集。就是这样。
-
稍后我将向大家展示这是如何完成的。特别是对我的问题-1的人。我应该将 IntPtr 传递给 Win32 窗口处理程序,然后在 WPF 应用程序中,我可以使用指向该 IntPtr 的 HwndSource 接管窗口