我正在开发一个Windows窗体项目。它包含一个标签控制器,每个页面都有多个页面和多个控件。
最近,在一些表单更改之后,每次构建并运行解决方案时,表单都会调整大小/缩小。
因此,如果我将表单高度的大小设置为768,一旦我单击“开始”构建并运行它,我实际上可以看到它在此过程中调整自身大小,然后表单加载比像素短21个像素它在构建时的高度值。
如果我继续构建并运行我的项目,表单每次将减少21个像素,使每次构建时它变得越来越小。
当我们将“DataGridView”控制器添加到其中一个选项卡时,我们认为可能已经引入了它,但我们还没有证明是否是这种情况。
为什么会发生这种情况有什么原因,这可能是做什么的? 为什么它会在构建运行时自行调整大小?
答案 0 :(得分:6)
这是一个烦人的错误,我自己也遭遇过类似的行为。但是,可能会有一些解决方法,但是要注意,这些可能会有所帮助,也可能没有帮助,听起来有点笨拙。
如果您的控件未停靠,则停靠可能会有所帮助。
您可以更改DPI设置以消除此问题,即:
显示属性→设置选项卡→高级。在高级对话框中,我将“DPI设置”从大(120 dpi)更改为 Normal (96 dpi)。
这可能是由于AutoScaleMode属性造成的。您的表单可能使用与Windows显示设置中不同的DPI或字体设置进行设计。尝试在表单和违规控件中将AutoScaleMode属性设置为None,它们将不再自动重新调整大小。
答案 1 :(得分:4)
显然,Visual Studio 2015中存在一个错误。在满足特定情况时,它不会正确计算Size
。在我的情况下,我使用以下...
(Name): Form1
AutoScaleMode: Font
AutoSizeMode: GrowOnly
DoubleBuffered: True
Font: Verdana, 8.25pt
FormBorderStyle: FixedDialog
Icon: (Icon)
MaximizeBox: False
MinimizeBox: False
MinimumSize: 600, 170
Size: 600, 170
StartPosition: CenterParent
Text: MyTitle
现在......如果您关闭此表单并将其重新打开,Size
仍然完全相同(600,170)。如果您更改以下属性...
ControlBox: False
然后您关闭表单并将其重新打开,您会发现Size
现已更改为(610,203)。
我的猜测是这个错误并不是两件事。一个是表单标题栏HEIGHT。另一个是标题栏图标WIDTH。这可能是WIDTH of 10
像素和HEIGHT of 33
像素的偏移量。
嗯,实际上你有三个解决方法。一个是抵消MinimumSize
。另一个是实际显示ControlBox
。最后一个是通过在初始化表单后设置ControlBox
属性来解决代码中的问题。
抵消MinimumSize
:
因此,第一个选择是通过(w:10,h:33)来抵消MinimumSize
所需的内容。例如,如果您希望MinimumSize
(600,170),则需要将其设置为(590,137)。这实际上会产生你期望看到的大小。
显示ControlBox
:
只需更改以下属性...
ControlBox: True
使用代码纠正问题:
您需要在设计时更改以下属性...
ControlBox: True
然后,您需要在初始化表单后将ControlBox
属性设置为False
。
public Form1()
{
InitializeComponent();
this.ControlBox = false;
}
答案 2 :(得分:2)
我遇到了同样的问题。我的解决方案:
我的电脑系统是Windows 10.显示器的分辨率为125%,我将其设置为100%。然后我设置表单的大小,而不是更改。
您可以在此图片中看到分辨率设置:
土耳其语“Scale”是“Ölçekle”。底部有解决方案选项(“ölçeklevedüzenle”)。
答案 3 :(得分:1)
好的,首先回应Saruman建议的解决方案..
应用程序中没有停靠值的控制器。少数几个被锚定,但没有一个出现停靠。我停靠了几个我能找到的主要容器,但它似乎并没有多大区别。不可否认,我没有停靠每一个控制器,但后来我转到解决方案2 ...
我不知道在哪里可以找到DPI设置。无论是在Visual Studio中的某个地方,还是在我的机器上。所以我转到提议的解决方案3 ......
在Form初始化时,我添加了'this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;'。这似乎自动将它置于'this.ClientSize = new System.Drawing.Size(11264,730)'方法之上,这引起了我的兴趣。
通过稍微进一步调试,似乎在应用程序构建和初始化时,'this.ClientSize'属性已经设置为非常低,或多或少,'230x200'。我不确定这个值来自何处,但我想知道它是否与初始调整大小有关,然后再尝试将其设置为更大的值...
无论如何,我遇到了另一个建议,可能会双重检查我的表单的最小宽度和高度属性,并注意到它们被设置为0x0,我默认是假设。
所以我将最小值设置为与我的表单的大小值相同,并且在后续构建中,它现在似乎保持其大小!或者至少,它不会从我能说的内容中缩小。
我不确定设置最小表单大小是否是这种奇怪行为的可接受的解决方案,但到目前为止,似乎是在我们所做的每个构建上保持应用程序大小一致,这在目前是一种解脱。 / p>
如果任何人对ClientSize属性有进一步的了解,并且如果我对它的初始低尺寸感到担心是正确的,那么听听它会很棒。 :)
答案 4 :(得分:1)
我明白了!
如果您点击“设计视图”中的表单→“属性”→“MinimizeBox” 并将“True”更改为“False”。
答案 5 :(得分:0)
升级到 .NET framework 4.7+ 将解决文本被裁剪的问题。此外,如果这不适用,请将以下行添加到 app.config 文件
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>
这将禁用窗口执行的缩放,因此应用程序大小不会改变。如需了解详情,请访问 Auto Scaling in Windows Forms
答案 6 :(得分:0)
如果您在 Visual Studio 2019 中遇到此问题,一个简单的解决方法是将表单的 AutoSize
属性设置为 True
,然后放置一个小的不可见控件,例如Panel
,在表格右下角的表格中。将面板调整为类似于 20,20
的大小。
当表单在运行时自动调整大小时,Windows 将计算表单大小以包括您表单的所有控件,其中将包括您放置在右下方的小面板。
我认为这是在不影响 Windows 自动缩放的情况下调整表单大小的最简单、最简单的方法。
答案 7 :(得分:-1)