c# - 将 WPF 控件公开为 ActiveX 控件

标签 c# wpf winforms activex

为什么无法直接将 WPF 控件公开为 ActiveX,而无需在 WinForms 控件中托管 wpf 控件,然后将 WinForms 控件公开为 ActiveX?我读过的所有文章: -WPF User Control in a Dialog System Application -WPF Vista Gadgets using ActiveX 将其作为事实发布?但没有人解释为什么?

最佳答案

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

我提供的任何细节可能都过于简化,但我会尝试举几个例子:

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

另一个例子是 WPF 使用不同的方法在屏幕上呈现视觉元素。 WPF 使用保留模式图形系统,该系统不同于 Win32 和其他 GDI/GDI+ 框架的立即模式图形系统。您可以阅读更多相关信息 here .

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

关于c# - 将 WPF 控件公开为 ActiveX 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11294297/

相关文章:

c# - c#中的初始化表达式

c# - 带有 ViewModel 参数的 WPF 转换器

wpf - ListBox项内的按钮时如何绑定(bind)命令

c# - C#中异步调用方法

c# - 如何处理资源 (.resx) 文件中的字符串文字

c# - dataadapter.update() 不保存到数据库

c# - 允许每个实例一个代理的最佳 WebBrowser 控件是什么?

c# - 给定边界矩形、起始角和扫角,如何确定圆弧端点

winforms - F# Winforms Dispatcher BeginInvoke Delegate 运行时问题

c# - 使用 DLL 基地址读取内存