控件的继承体系

控件的继承体系

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);
    }
}

为什么了解继承关系很重要

  1. 统一操作​ — 因为都继承自 Control,可以统一处理一批控件
  2. 多态​ — 可以用 Control 类型引用任何控件
  3. 自定义控件​ — 继承现有控件扩展功能
// 遍历窗体上所有控件,统一设置字体
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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注