c# - 创建 Form.MinimumClientSize 属性

标签 c# .net forms winforms

Windows 窗体具有 SizeClientSize 属性。 Windows 窗体还有一个 MinimumSize 属性,可让您设置允许的最小窗体大小。我正在寻找一种方法来设置表单的最小 ClientSize。我是 c# 的新手,我不确定执行此操作的最佳方法。

我想到我可以使用 Form.SizeChanged 事件来检查和限制表单大小,但这看起来很麻烦,我正在寻找另一种方法。

注意:如果更改了表单边框大小,我希望保持最小客户端大小。

最佳答案

如何设置窗体客户区的最小尺寸。

Form.MinimumSize 属性设置整个 Form 的最小尺寸,包括当前边框、Caption 和 subtle调整窗体大小时和执行新布局时应用的内部填充(许多因素决定此事件)。

它可能是难以察觉的,因为它很快(而且通常没有人关心),但表单大小和客户端大小之间的关系并不是恒定的。它可以在调整窗体大小时更改,拖动其边框。或者系统事件导致这种情况发生。

此外,在许多部门(Windows 的属性、主题、Dpi、字体大小等)中,更改系统设置可以确定窗体大小与其客户区大小之间关系的变化。

好消息是窗体知道这些变化,并且在收到以某种方式改变 Windows 方面的系统事件通知时,重新执行其布局。
当这种情况发生时(它经常发生,总是在调整窗体大小时),OnLayout方法被调用。

重写 OnLayout,允许更新依赖于窗口/客户区度量的值。

➨ It can be interesting to see what happens when System settings, affecting the aspect of the Windows, are changed while the application is running. In this specific context, how many times the OnLayout method is called and what the LayoutEventArgs properties are set to.

考虑到所有这些,我们可以创建一个公共(public)的 MinimumClientSize 属性。
我们覆盖 OnLayout 并将 Form.MinimumSize 重置为新的 Form.MinimumClientSize 加上 Form.SizeForm.ClientSize 之间的区别。

例如,如果我们需要将客户区大小保持在 (500, 500) 的最小值:

private Size m_MinimumClientSize = new Size(500, 500);

public Size MinimumClientSize {
    get => m_MinimumClientSize;
    set { m_MinimumClientSize = value;
          PerformLayout();
    }
}

protected override void OnLayout(LayoutEventArgs e) {
    base.OnLayout(e); 
    MinimumSize = m_MinimumClientSize + (Size - ClientSize);
}

如果我们在 OnLayout 方法中添加:

Console.WriteLine($"ClientSize: {ClientSize}");
Console.WriteLine($"MinimumSize: {MinimumSize}");
Console.WriteLine($"Size: {Size}");

很明显,Form.SizeForm.ClientSize 之间的关系并不总是相同的。

我们还可以这样计算 Size 和 ClientSize 之间的差异:

 var borderSize = new Size(
    (SystemInformation.FrameBorderSize.Width * SystemInformation.BorderMultiplierFactor 
        + (SystemInformation.Border3DSize.Width * 2)) * 2, 
    (SystemInformation.FrameBorderSize.Height * SystemInformation.BorderMultiplierFactor 
        + (SystemInformation.Border3DSize.Height * 2)) * 2);

var captionSize = new Size(0, SystemInformation.CaptionHeight);

MinimumSize = MinimumClientSize + borderSize + captionSize;

这些固定措施是正确的。在正常情况下,它们提供相同的值。
不过,并非总是如此。从不,当一个表单被调整到它的 MinimumSize 时。
另外,我们只考虑带有 3d 边框的表单。
好吧,我们也可以覆盖 WndProc...

关于c# - 创建 Form.MinimumClientSize 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59795639/

相关文章:

c# - 是否有适用于 .NET 的内置或广泛使用的不区分大小写的字符串类型

c# - C# 中的 IE 插件能够与 mysql 通信

javascript - 在 iframe 中设置输入文本并提交

c# - 使用空值连接的 LINQ to SQL 字符串

c# - StartInfo 的替代权限

c# - 设置中的 .NET Core Moq Params 数组

javascript - 为什么在 Chrome 中按 Enter 键时我的表单无法提交?

c# - Linq Entity Framework - 让所有客户的 ID 不在多对多表中

.net - 尝试读取或写入 protected 内存

forms - 尝试思考如何在angular 2中构建多步表单