.NET 与 Mono WinForms - 呈现的实际窗体大小

.NET vs. Mono WinForms - actual Form size, as rendered

当我正在寻找在 Debian Linux 4.1.x(在 BeagleBone Black 上)上获得基于 GUI 的程序的最快方法 运行 时,我偶然发现了这个线程:

我最熟悉的提供 GUI 的平台是 .NET,所以这似乎是一个完美的情况。 现在,当我在 VS2017 中组合一个 WinForms 应用程序时,即使使用非常新的 .NET 4.7.1,编译它,在 Linux 目标上使用 mono 复制和执行,它确实有效。 如果不是这个小剧透,我会很高兴:

如果我将 Visual Studio 中的主 Windows.Forms.Form 的分辨率设置为 800x480,这是 BeagleBone 应该获得的 TFT 显示器的原始分辨率,一方面,我注意到该 WinForms 应用程序表单的屏幕截图仅为 784x472 而不是 800x480(Windows 10),这已经足够有趣了。但它变得更有趣。

首先,设置: BeagleBone 现在有一个全高清 (1920x1080) 屏幕连接到它的 HDMI 端口,我将分辨率配置为后来的目标 800x480,当然,这看起来并不漂亮,但那里的极简主义 GUI 确实告诉我系统设置真的是800x480.

现在是踢球者: 该程序在 Windows (10) 中给我名义上太小的屏幕截图,即 16x8 像素短,但在 BeagleBone 上使用 Mono 执行时实际上显示为 太宽 。不仅仅是几个像素太宽,更像是 1/4 太宽。

有人知道为什么吗? ...一个解决方案也很好。 (好吧,在 VS 中缩小所有内容直到它适合,但这不是一个好的解决方案)。

我知道目前在 Mono WinForms 支持方面没有做太多工作,但这看起来是一个如此简单的问题...这使得修复似乎并非完全不现实 ;)

这可能是由 AutoScaling 引起的。您可以尝试按照描述禁用它 here:

export MONO_MWF_SCALING=disable
mono myapp.exe

如果这解决了问题,您可以通过从表单的设计器代码中删除以下行来在您的应用程序中禁用它:

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

(此行由 Visual Studio 创建新表单时自动添加。但是,如果您的表单因此在 Linux 上看起来很糟糕,它们在任何 Windows默认字体已更改的计算机。)

首先,感谢 "OL.",是他让我走上了正轨。有些事情显然发生了变化,因此我自己的回复。

因此,导出 MONO_MWF_SCALING=disable 对这种情况完全没有任何作用。但我并没有让自己分心,而是继续调查。 我在解决方案范围内的搜索中没有找到 AutoScaleBaseSize。但是设计器文件中的内容是:

  this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

我把第一个注释掉了,把第二个改成了:AutoScaleMode.None; 这样就形成了一种至少适合屏幕的形式。这次有点小了。 虽然在设计器中它显示 .Size 为 800x480,但这并没有像那样在设计器文件中设置。 取而代之的是:

  this.ClientSize = new System.Drawing.Size(784, 441);

有趣。也许 Mono 的边界或其他不同之处。如果某个外部分辨率是目标,那么设置 ClientSize 不是最明智的做法......? 我将其更改为:

  this.Size = new System.Drawing.Size(800, 480);

Et voila,尺寸正确。 现在将表单 Location 设置为 (0,0),一切都如我所愿。 嗯,差不多。

原始问题/主要问题已回答,因此接受。 对于那些关心的人,我将描述我仍然看到的小问题, 作为评论。