为什么不能直接将WPF控件暴露为ActiveX ,而不在WinForms控件中托管wpf控件,然后将WinForms控件暴露为ActiveX?我读过的所有文章: - WPF User Control in a Dialog System Application - WPF Vista Gadgets using ActiveX 发布它作为一个事实?但没有人解释为什么?
答案 0 :(得分:3)
一个重要原因是它们是完全不同的图形和渲染系统。创建WPF窗口时,它与Win32窗口完全不同,因此与主机操作系统的交互方式不同。想想.NET与COM。这些是完全不同的“框架”,它们都在Windows上运行,并且可以互操作,但它们完全不同,并且需要一些环节才能一起工作。我认为WPF是WinForms,因为.NET是COM。
我提供的任何细节可能都过度简化了,但我会尝试几个例子:
例如,在Win32中,窗口上的每个控件(每个标签,按钮等)都是它自己的“窗口”,它有自己的WindowHandle(和消息泵),它从Windows接收消息。在WPF中,只有一个窗口(顶层窗口,甚至可能不完全正确,因为WPF窗口不是Win32意义上的窗口),WPF负责将任何来自操作系统的消息传递给屏幕上的适当元素。您可以阅读有关此内容的更多信息(包含一些指向源代码的链接)here。
另一个例子是WPF使用不同的方法在屏幕上呈现视觉元素。 WPF使用保留模式图形系统,这与Win32和其他GDI / GDI +框架的立即模式图形系统不同。您可以阅读有关here的更多信息。
还有很多其他原因,我敢肯定,但最终,它们只是完全不同的技术。所以为了让它们一起工作,你需要跳过一些箍(使用两个Host控件进行互操作)。我建议您阅读的WPF越多,特别是关于图形和渲染的高级主题,您就越能理解为什么它不仅仅与WinForms“兼容”。