Visual Studio MDI窗体引用错误及Form2边框宽度查询
问题解答
嘿,刚接触Visual Studio和C#的话,遇到这种MDI窗体的小问题太正常了,我来帮你拆解清楚~
一、为什么Form2.Size.Width会报错?
你碰到的这个错误核心是混淆了类本身和类的实例对象:
Form2是你的窗体类,它更像一个“模板”,不是你实际打开的那个子窗体窗口;this在Form2的代码里指代的是当前正在运行的Form2实例(就是你看得见的那个子窗体),所以this.Size.Width能正常获取到当前窗口的宽度。
而Form2.Size是试图直接访问类的静态属性,但Size是实例属性——必须通过具体的窗体对象才能调用。解决方法分两种情况:
- 如果是在Form2自己的代码里调整textBox宽度,直接用你之前的
this.Size.Width -16就完全没问题; - 如果是在父窗体Form1里要调整子窗体的textBox,那你需要先拿到打开的Form2实例:
比如你打开子窗体的时候应该是这样写的:
之后要调整宽度时,就用这个// 在Form1里打开Form2的代码 Form2 myChildForm = new Form2(); myChildForm.MdiParent = this; myChildForm.Show();myChildForm实例来访问Size:
要是你找不到之前的实例,也可以通过Form1的myChildForm.textBox1.Width = myChildForm.Size.Width -16;MdiChildren集合来查找:// 遍历所有子窗体找到Form2实例 foreach (Form child in this.MdiChildren) { if (child is Form2 targetForm) { targetForm.textBox1.Width = targetForm.Size.Width -16; break; } }
二、如何获取Form2的边框宽度?
获取窗体边框宽度有两种常用方法:
方法1:通过客户区和窗体大小的差值计算
窗体的ClientSize是内部可使用的区域(不含边框、标题栏),所以边框的总宽度/高度可以用窗体整体大小减去客户区大小得到:
// 在Form2的代码里 int totalBorderWidth = this.Width - this.ClientSize.Width; // 左右边框的总宽度 int singleBorderWidth = totalBorderWidth / 2; // 单边边框宽度(左或右) int titleBarHeight = this.Height - this.ClientSize.Height; // 标题栏高度(含顶部边框)
方法2:使用SystemInformation类直接获取
C#提供了SystemInformation类可以直接获取系统UI元素的尺寸,不用自己计算,适配性更强:
using System.Windows.Forms; // 需要引用这个命名空间 // 单边边框的宽度 int borderWidth = SystemInformation.BorderSize.Width; // 标题栏的高度 int titleBarHeight = SystemInformation.CaptionHeight;
内容的提问来源于stack exchange,提问作者JuMoGar
相关产品推荐
相关产品推荐

