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# - char 的数据契约反序列化问题 - C#

c# - 我收到错误 'EntityType has no key defined',即使我在模型和数据库中都定义了一个键

wpf - DrawingVisual 上模糊效果的替代方案

c# - 数据网格:用户无法编辑或选择行

.net - 是否有 MessageBox.Show 的非阻塞版本(或类似的版本)?

c# - 为什么我只能从 BackgroundWorker 访问某些 UI 控件属性?

c# - 仅使用 POCO 的项目上的 TypeLite?

c# - SslStream.AuthenticateAsClient 异常(消息格式错误)

c# - WPF DataGrid 添加行但不添加数据(空白行)

C#:当用户开始输入时激活文本框