继承System.Windows.Forms.Label时AutoSize重写未生效问题
问题:基于Label自定义Separator控件不遵循AutoSize设置
我尝试通过重写属性,基于Label创建自定义Separator控件,目前其他功能正常,但控件不遵循AutoSize属性设置:已将其设为false,但绘制时仍表现为AutoSize=true,宽度固定为2,修改尺寸也无效。请问我遗漏了什么?
using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace WinForms.Controls { public class Separator : Label { [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override Size MaximumSize { get => new(0, 2); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override Size MinimumSize { get => new(2, 2); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override BorderStyle BorderStyle { get => BorderStyle.Fixed3D; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override string Text { get => string.Empty; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override ContentAlignment TextAlign { get => base.TextAlign; set => base.TextAlign = value; } } }
解决方案
问题出在两个核心点:
未强制初始化AutoSize为false
Label默认AutoSize是true,你仅重写了属性暴露逻辑,但未在控件构造阶段强制关闭该属性,导致控件创建时仍沿用默认的自动尺寸计算逻辑。MaximumSize设置逻辑有问题
你设置MaximumSize = new(0, 2),WinForms中宽度为0会被解析为“无限制”,但结合空Text的Label自动尺寸逻辑,控件会直接取MinimumSize的宽度值(2);同时你仅重写了MaximumSize的getter,未处理setter,会导致属性设置逻辑不完整。
修改后的代码如下:
using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace WinForms.Controls { public class Separator : Label { public Separator() { // 构造阶段强制关闭自动尺寸 base.AutoSize = false; // 初始化默认尺寸,方便设计时调整 Size = new Size(200, 2); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override bool AutoSize { get => false; set => base.AutoSize = false; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override Size MaximumSize { get => new Size(int.MaxValue, 2); set => base.MaximumSize = new Size(int.MaxValue, 2); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override Size MinimumSize { get => new(2, 2); set => base.MinimumSize = new(2, 2); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override BorderStyle BorderStyle { get => BorderStyle.Fixed3D; set => base.BorderStyle = BorderStyle.Fixed3D; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override string Text { get => string.Empty; set => base.Text = string.Empty; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override ContentAlignment TextAlign { get => base.TextAlign; set => base.TextAlign = value; } } }
关键修改说明:
- 在构造函数中直接设置
base.AutoSize = false,确保控件从创建时就关闭自动尺寸 - 重写AutoSize的getter直接返回false,setter强制设为false,彻底避免外部修改
- 将MaximumSize的宽度改为
int.MaxValue,明确标注宽度无限制,阻断Label自动尺寸逻辑的干扰 - 为所有重写属性补充完整的setter逻辑,确保属性设置不会被忽略
修改后控件即可正常响应尺寸调整,AutoSize始终保持关闭,宽度可自由设置,高度被限制在2以内。
内容的提问来源于stack exchange,提问作者Jeremy Hodge
相关产品推荐
相关产品推荐

