在更改边框样式时,强制窗体的内部保持在同一位置

本文关键字:内部 位置 窗体 边框 样式 | 更新日期: 2023-09-27 18:21:05

我有一个winform,它一开始有一个相当大的边框。窗体上有一个按钮,按下它时,会将窗体更改为border-style none。

问题是,然后表单的内部稍微向上和向左移动。我想确保,无论使用什么边界,表单的"内部"部分都将始终保持在同一位置(注意:但我仍然希望表单在选择了可移动边界时可以四处移动)

谢谢。

在更改边框样式时,强制窗体的内部保持在同一位置

无边界表单向上移动并稍微向左移动,因为这是表单当前所在的位置,您需要计算边界。为了实现您所处的结果,您需要重新分配位置属性,并为此需要考虑客户端大小和整个大小(带边框),我认为代码很简单,我相信它将不言自明:

private void button1_Click(object sender, EventArgs e)
{
    var X = (this.Size.Width - this.ClientRectangle.Width) / 2;
    var Y = (this.Size.Height - this.ClientRectangle.Height) - X;
    Point p = new Point(Location.X + X, Location.Y + Y);
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    this.Location = p;
}

另一个选项是在包含带边框面板的父级上设置填充。例如

public class Form10 : Form {
    Button btn = new Button { Text = "Button", Location = new Point(100, 100) };
    Panel border = new Panel { Dock = DockStyle.Fill, BorderStyle = BorderStyle.Fixed3D };
    public Form10() {
        Controls.Add(border);
        border.Controls.Add(btn);
        btn.Click += delegate {
            if (border.BorderStyle == BorderStyle.Fixed3D) {
                border.BorderStyle = BorderStyle.None;
                border.Parent.Padding = new Padding(2);
            }
            else {
                border.BorderStyle = BorderStyle.Fixed3D;
                border.Parent.Padding = new Padding(0);
            }
        };
    }
}