控件的继承体系
WinForm 中的控件都定义在 System.Windows.Forms 命名空间下,它们之间存在清晰的继承层次关系。
所有控件的顶层基类是 Control 类,它提供了控件最基本的能力:位置、大小、可见性、启用状态、事件处理等。
核心继承链
Object
└── MarshalByRefObject
└── Component
└── Control ← 所有控件的基类
└── ScrollableControl
└── ContainerControl
└── Form ← 窗体Code language: JavaScript (javascript)
常见控件的继承关系
public class Label : Control
public class Button : ButtonBase
public class ButtonBase : Control
public class TextBox : TextBoxBase
public class TextBoxBase : Control
public class ComboBox : ListControl
public class ListControl : Control
public class Form : ContainerControl
public class Panel : ScrollableControl
public class GroupBox : Control
Control 类提供的基础成员
// 位置和大小
control.Location = new Point(10, 10);
control.Size = new Size(100, 30);
// 可见性和启用状态
control.Visible = true;
control.Enabled = true;
// 文本
control.Text = "按钮";
// 事件
control.Click += Control_Click;
control.Paint += Control_Paint;Code language: JavaScript (javascript)
Form 继承链示例
public class Form1 : Form
{
private Label lblName;
private Button btnOK;
public Form1()
{
InitializeComponent();
// Form 本身也是 Control,所以也有 Location、Size 等属性
this.Text = "示例窗体";
this.Size = new Size(400, 300);
// Label 和 Button 都继承自 Control
lblName = new Label();
lblName.Text = "姓名:";
lblName.Location = new Point(20, 20);
lblName.Size = new Size(60, 20);
btnOK = new Button();
btnOK.Text = "确定";
btnOK.Location = new Point(100, 60);
btnOK.Click += btnOK_Click;
this.Controls.Add(lblName);
this.Controls.Add(btnOK);
}
private void btnOK_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello " + lblName.Text);
}
}
为什么了解继承关系很重要
- 统一操作 — 因为都继承自
Control,可以统一处理一批控件 - 多态 — 可以用
Control类型引用任何控件 - 自定义控件 — 继承现有控件扩展功能
// 遍历窗体上所有控件,统一设置字体
foreach (Control c in this.Controls)
{
c.Font = new Font("微软雅黑", 10);
}
// 多态:Control 引用指向 Label
Control ctrl = new Label();
ctrl.Text = "这是Label";Code language: JavaScript (javascript)
容器控件
ContainerControl 及其子类可以包含其他控件,通过 Controls 集合管理子控件:
Form → ContainerControl → 可以包含其他控件
Panel → ScrollableControl → 可以包含其他控件
GroupBox → Control → 可以包含其他控件
Panel panel = new Panel();
panel.Controls.Add(new Button() { Text = "按钮1", Location = new Point(10, 10) });
panel.Controls.Add(new Button() { Text = "按钮2", Location = new Point(10, 50) });
this.Controls.Add(panel);Code language: JavaScript (javascript)


Previous: 创建WinForm项目
Next: Label 控件常用属性