为什么不能直接将 WPF 控件公开为 ActiveX ,而不在 WinForms 控件中托管 wpf 控件,然后将 WinForms 控件公开为 ActiveX?我读过的所有文章: -对话框系统应用程序中的 WPF 用户控件 -使用 ActiveX 的 WPF Vista 小工具将 其作为事实发布?但没有人解释为什么?
1 回答
一个重要原因是它们是完全不同的图形和渲染系统。创建 WPF 窗口时,它与 Win32 窗口完全不同,因此与主机操作系统的交互方式也不同。想想 .NET 与 COM。这些是完全不同的“框架”,它们都在 Windows 上运行,并且可以互操作,但是它们完全不同,并且需要一些箍才能一起工作。我认为 WPF 之于 WinForms 就像 .NET 之于 COM。
我提供的任何细节都可能过于简化,但我会尝试几个例子:
例如,在 Win32 中,窗口上的每个控件(每个标签、按钮等)都是它自己的“窗口”,它有自己的 WindowHandle(和消息泵)从 Windows 接收消息。在 WPF 中,只有 1 个窗口(顶级窗口,甚至这可能也不完全正确,因为 WPF 窗口不是 Win32 意义上的窗口),并且 WPF 负责将任何消息从操作系统传递到屏幕上的适当元素。您可以在此处阅读有关此内容的更多信息(带有一些来源链接)。
另一个例子是 WPF 使用不同的方法在屏幕上呈现视觉元素。WPF 使用保留模式图形系统,它不同于 Win32 和其他 GDI/GDI+ 框架的即时模式图形系统。您可以在此处阅读更多相关信息。
我敢肯定,还有很多其他原因,但归根结底,它们只是完全不同的技术。因此,为了让它们一起工作,您需要跳过一些障碍(使用两个 Host 控件进行互操作)。我建议您阅读有关 WPF 的内容越多,尤其是有关图形和渲染的高级主题,您就越能理解为什么它不仅仅与 WinForms“兼容”。