如何将 Windows 窗体适配/调整大小以适应任何屏幕分辨率?

4

我知道这是一个重复的问题,但我检查了所有其他相关问题和它们的答案没有帮助(结果仍然与截图2中显示的相同)

screenshot1

我是c# windows表单的新手。如截图1所示,我有一个名为Form1的窗体,其中包含一些控件,每个控件组都放在一个面板中。我在PC1上设计了该应用程序,如截图1所示,适合屏幕分辨率并且工作正常。

Screenshot2

我的应用程序是在1366 x 768屏幕分辨率下开发的(如截图1所示),但当我在不同的计算机(PC2)上运行此应用程序时,由于不同的监视器大小和不同的屏幕分辨率,窗体显示得太大,应用程序的某些部分缺失或超出屏幕。

但是,我使用锚点解决了这个问题,但另一个问题出现了,即:用户控件不会自动调整大小(如截图2所示),部分控件被切割或移动到了panel1下面。我不知道问题是与用户控件相关还是与Form1中的所有控件相关(它们应该自动调整大小)

我甚至尝试了以下代码,但结果仍然相同:

this.WindowState = FormWindowState.Maximized;
this.Location = new Point(0, 0);
this.Size = Screen.PrimaryScreen.WorkingArea.Size;
Screen.PrimaryScreen.WorkingArea

我昨天花了一整天的时间来解决这个问题,但是我失败了。请给我任何可能有效的想法/建议。谢谢。


3
了解 TableLayoutPanelFlowLayoutPanel - Sinatr
在控件中间,右键单击,选择面板并选择置前。您的面板似乎存在一个z索引问题。文档大纲控件也有助于将控件移动到正确的位置。这对于刚开始使用面板的人来说很常见。您还需要确保面板与中间面板对齐,外部面板位于左侧和右侧,并填充中间面板。 - DoomVroom
2个回答

6
如果您正在使用Windows Forms,无法转换为WPF,则最好将所有设计都放在必须运行的最低分辨率下进行。 在WinForms中,您设置每个元素的大小,因此它们不会根据应用程序大小重新调整大小。 它们将被分布在空白空间中(如果您编写程序的话),增加它们之间的自由空间,仅此而已。 正如Sinatr所说,另一个选项是LayoutPanels,它们试图提供WPF面板功能。

3
默认情况下,在WinForms中,你在设计表单时放置的所有控件都具有固定大小。如果你不做任何特殊处理,控件在放置时的大小就是它们始终具有的大小,无论在什么机器上运行。

正如你已经注意到的那样,这并不总是能够得到良好的结果。解决方法是使用流式布局,并大量使用TableLayoutPanel和/或FlowLayoutPanel容器控件,以及针对单个子控件使用AnchorDock属性。如果你特别注意正确布置表单上的控件,它们可以动态调整大小和重新排列以适应可用的屏幕空间。

这段代码

this.WindowState = FormWindowState.Maximized;
this.Location = new Point(0, 0);
this.Size = Screen.PrimaryScreen.WorkingArea.Size;
Screen.PrimaryScreen.WorkingArea

这段代码没有实际作用。你只需要第一行代码就可以了。一旦你将表单最大化,它就会填满整个屏幕。你不需要通过设置 SizeLocation 属性来强制实现。事实上,这些属性对最大化的表单没有任何影响。

问题可能是你放置在表单上的控件没有自动调整大小(如上所述)。如果你有足够大的屏幕,你会看到空白处,因为表单填满了屏幕,但没有控件。你遇到的相反的问题:在较小的屏幕上,控件不能适应,因此重叠。

这并不是完美的情况。即使你编写了完美的动态布局,如果你尝试在比设计意图小得多的屏幕上运行应用程序,你最终会得到太小无法点击的按钮。这就是为什么应用程序通常不是这样设计的原因。充满按钮的屏幕是可怕的用户界面。这种设计只有在为触摸屏幕用户界面(如餐厅 POS)设计时才是可以接受的。在这种情况下,你已经非常清楚客户使用的屏幕大小,因为这都是专业硬件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接