C# 将WPF控件公开为ActiveX控件

C# 将WPF控件公开为ActiveX控件,c#,wpf,winforms,activex,C#,Wpf,Winforms,Activex,为什么不在WinForms控件中托管WPF控件,然后将WinForms控件作为ActiveX公开,就不可能直接将WPF控件作为ActiveX公开?我读过的所有文章: - - 把它当作事实发布?但是没有人解释为什么?一个重要原因是它们是完全不同的图形和渲染系统。创建WPF窗口时,它与Win32窗口完全不同,因此与主机操作系统的交互方式也不同。想想.NET和.COM。这些完全不同的“框架”都运行在Windows上,并且可以相互操作,但是它们完全不同,并且需要一些箍环才能协同工作。我认为WPF对于

为什么不在WinForms控件中托管WPF控件,然后将WinForms控件作为ActiveX公开,就不可能直接将WPF控件作为ActiveX公开?我读过的所有文章: - -
把它当作事实发布?但是没有人解释为什么?

一个重要原因是它们是完全不同的图形和渲染系统。创建WPF窗口时,它与Win32窗口完全不同,因此与主机操作系统的交互方式也不同。想想.NET和.COM。这些完全不同的“框架”都运行在Windows上,并且可以相互操作,但是它们完全不同,并且需要一些箍环才能协同工作。我认为WPF对于WinForms就像.NET对于COM一样重要

我提供的任何细节都可能过于简化,但我将尝试使用几个示例:

例如,在Win32中,窗口上的每个控件(每个标签、按钮等)都是自己的“窗口”,具有自己的WindowHandle(和消息泵),用于接收来自Windows的消息。在WPF中,只有一个窗口(顶层窗口,甚至可能不是完全正确的,因为WPF窗口不是Win32意义上的窗口),WPF负责将任何消息从操作系统传递到屏幕上的适当元素。您可以阅读更多关于这方面的内容(带有一些到源代码的链接)

另一个例子是WPF使用不同的方法在屏幕上呈现可视元素。WPF使用保留模式图形系统,这与Win32和其他GDI/GDI+框架使用的即时模式图形系统不同。你可以阅读更多关于这方面的内容


我相信还有很多其他原因,但归根结底,它们只是完全不同的技术。因此,为了让它们协同工作,您需要跳过一些障碍(使用两个主机控件进行互操作)。我建议您对WPF的了解越多,特别是关于图形和渲染的高级主题,您就越能理解为什么它不仅与WinForms“兼容”

一个重要原因是它们是完全不同的图形和渲染系统。创建WPF窗口时,它与Win32窗口完全不同,因此与主机操作系统的交互方式也不同。想想.NET和.COM。这些完全不同的“框架”都运行在Windows上,并且可以相互操作,但是它们完全不同,并且需要一些箍环才能协同工作。我认为WPF对于WinForms就像.NET对于COM一样重要

我提供的任何细节都可能过于简化,但我将尝试使用几个示例:

例如,在Win32中,窗口上的每个控件(每个标签、按钮等)都是自己的“窗口”,具有自己的WindowHandle(和消息泵),用于接收来自Windows的消息。在WPF中,只有一个窗口(顶层窗口,甚至可能不是完全正确的,因为WPF窗口不是Win32意义上的窗口),WPF负责将任何消息从操作系统传递到屏幕上的适当元素。您可以阅读更多关于这方面的内容(带有一些到源代码的链接)

另一个例子是WPF使用不同的方法在屏幕上呈现可视元素。WPF使用保留模式图形系统,这与Win32和其他GDI/GDI+框架使用的即时模式图形系统不同。你可以阅读更多关于这方面的内容


我相信还有很多其他原因,但归根结底,它们只是完全不同的技术。因此,为了让它们协同工作,您需要跳过一些障碍(使用两个主机控件进行互操作)。我建议您对WPF的了解越多,特别是关于图形和渲染的高级主题,您就越能理解为什么它不仅与WinForms“兼容”

也许询问者想知道为什么ActiveX在WPF中可用之前需要先被WinForm触摸?至少我想知道。感谢您的示例询问者可能想知道为什么ActiveX在WPF中可用之前需要先被WinForm触摸?至少我想知道。谢谢你的例子