我在vb.net中使用Windows 10上的Visual Studio 2013开发Winform .NET 4.0应用程序。最近我购买了一台新笔记本电脑,我使用它的最大屏幕分辨率为2550x1440。
Visual Studio似乎会自动更改文件* .designer.vb和* .resx,对于我从新pc修改的每个表单,更改某些控件的位置和锚点。更确切地说,当我在另一台(旧)电脑上重新打开Winform项目时,我发现它真的很乱: - 表单的大小:通常表单大小减少,隐藏一些控件; - 某些控件的位置:其中一些与其他控件重叠; - ToolStripMenu图标的ImageScaling属性自动从16x16(正确的)更改为24x24,从而导致非常大的菜单!
我在这个主题上通过互联网阅读了很多页面,但我找不到任何合适的解决方案。其中一些来自StackOverflow,例如: - How do I keep Visual Studio's Windows Forms Designer from deleting controls?(无法理解为什么VS接触连续控制) - Why does Visual Studio automatically changes the layout of my form? - visual studio 2005 designer moves controls and resizes Form(关于这一点,它不是使用对接而不是锚定的解决方案,某些控件不支持它) - How to write WinForms code that auto-scales to system font and dpi settings?(如果我将AutoScale属性设置为DPI,表单显示不正确,并且无法正确调整大小!)
我试过的其他解决方案,但没有运气: - 禁用控件的AutoSize属性:不是解决方案,因为如果您在ToolStripMenus上执行此操作,则每次添加按钮或其他任何操作时都必须手动更改其大小; - 对AutoScaling属性采取行动:我尝试了这个属性的每个组合,唯一一个工作正常的是" Font"。
这是一个非常烦人的问题:有没有办法阻止VS修改控件的位置和尺寸?可能没有手动(或重新)重新排序每个表单的布局?非常感谢任何人
答案 0 :(得分:0)
在设置表单尺寸的过程中,表单尺寸受 Screen.GetWorkingArea 限制,而没有考虑 AutoScale 。
我解决了此问题,该问题存储了在 InitializeComponent()中设置的原始 ClientSize ,并在 HandleCreated 事件阶段自动将其重置。
private SizeF _autoScaleFactor;
private Size _originalClientSize;
protected override void SetClientSizeCore(int x, int y)
{
base.SetClientSizeCore(x, y);
_autoScaleFactor = AutoScaleFactor;
_originalClientSize = new Size(x, y);
}
protected override void OnHandleCreated(EventArgs e)
{
AutoScaleClientSize();
base.OnHandleCreated(e);
}
private void AutoScaleClientSize()
{
var dx = _autoScaleFactor.Width;
if (!dx.Equals(1.0F))
{
_originalClientSize.Width = (int)Math.Round(_originalClientSize.Width * dx);
}
var dy = _autoScaleFactor.Height;
if (!dy.Equals(1.0F))
{
_originalClientSize.Height = (int)Math.Round(_originalClientSize.Height * dy);
}
ClientSize = _originalClientSize;
}