【问题标题】:Why refernce to Windows.Systrem.Form is needed when using ElementHost为什么在使用 ElementHost 时需要参考 Windows.System.Form
【发布时间】: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 接管窗口

标签: c# wpf windows winforms


【解决方案1】:

没办法,你可以在WPF中使用Winform控件。

您应该使用 ElementHost 并添加对 System.Windows.Forms 程序集的引用。

【讨论】:

  • 我有办法避免它。我会在晚上展示样品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2011-01-28
  • 2012-10-01
  • 1970-01-01
  • 2018-03-14
  • 2015-03-21
相关资源
最近更新 更多