.NET GUI 中是不是仍在使用本机 Windows 控件?

Posted

技术标签:

【中文标题】.NET GUI 中是不是仍在使用本机 Windows 控件?【英文标题】:Are native Windows Controls still used in .NET GUIs?.NET GUI 中是否仍在使用本机 Windows 控件? 【发布时间】:2013-04-21 12:38:45 【问题描述】:

当您使用 WinForms 或 WPF 创建 GUI 时显示的内容是否仍然基于本机控件,例如 Common Controls 或任何 system provided Window Classes,或者显示的所有内容都是由框架绘制的“自定义”?

注意:我说的不是文件对话框之类的东西,而是实际使用 WinForms 或 WPF 实现的 GUI。

是的,这纯粹是出于兴趣。

【问题讨论】:

WPF 对 Window 对象使用“HWND”,但窗口内的所有其他对象(控件)都是与 Win32 没有任何关系的 WPF 对象,因为 AFAIK,winforms 使用单独的每个 UI 元素的 HWND。 【参考方案1】:

Windows 窗体对某些 UI 元素使用本机控件。 WPF 自己绘制所有内容。

【讨论】:

【参考方案2】:

用户 HighCore 评论:

WPF 对 Window 对象使用“HWND”,然后对所有其他对象使用 Window里面的(Controls)是WPF对象,跟Win32无关 无论如何,在 AFAIK 中,winforms 为每个 UI 使用单独的 HWND 元素。

事实上,使用 Spy++,当我们创建一个带有简单对话框/窗口和按钮的测试应用程序时,我们可以观察到以下情况:

MFC/本机:

应用程序窗口是一个窗口 (HWND),其窗口类为 #32770 (Dialog)(我使用了“基于对话框”的应用程序。) 按钮是一个单独的窗口(类:Button

Windows 窗体:

应用程序窗口有窗口类WindowsForms10.Window.8.app.0.2bf8098_r20_ad1(哦,我的) 按钮是一个单独的窗口(类:WindowsForms10.BUTTON.app.0.2bf8098_r20_ad1

WPF

只有 一个 ***窗口,尽管我在 UI 设计器中为该窗口添加了一个组合框、一个列表框和一个菜单。 唯一窗口的类是:HwndWrapper[WpfApplication1.exe;;9b1aec0f-1b88-419c-8730-858906314cd9]

Window 类的名称实际上非常有趣:使用 MFC/native 类,您可以获得多年来已知并记录在 MSDN 上的类。对于 Windows 窗体,它似乎总是使用相同的类名。使用 WPF,窗口类的名称似乎也包含可执行文件/进程名称。

显然,MS 认为不再需要每个窗口使用多个窗口。我想我需要为此提出第二个问题。

【讨论】:

Spy++ 不是逆向工程的好工具,你不能轻易看到各种弹出窗口。像工具提示、上下文菜单、组合框下拉菜单。也很容易错过遗留的,比如 shell 对话框和网络浏览器。

以上是关于.NET GUI 中是不是仍在使用本机 Windows 控件?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Net::Telnet 会话是不是仍在 Perl 中?

按钮在 Windows GUI 应用程序上看起来很丑(而不是 Windows 本机)

如何在我的 .NET 类中使用这个原生数组?

如何在 Tkinter 中使用“本机”GUI 外观?

CIDR 子网是不是有本机 .NET 类型?

情节提要未加载GUI但仍在编译[重复]