在InitializeComponent之后调用基础构造函数

时间:2012-09-07 11:19:34

标签: inheritance constructor derived-class

我正在开发一个包含许多面板的应用程序,所有面板都来自BasePanel用户控件 使用该应用程序非常类似于使用向导 - 每次在所有其他面板上方显示不同的面板 我希望有一个计时器,所以当没有用户活动时,会显示第一个面板。

以下是基本面板代码:

public partial class BasePanel : UserControl
{
    private Timer timer = new Timer();

    public BasePanel()
    {
        InitializeComponent();

        timer.Interval = 5000;
        timer.Tick += timer_Tick;

        foreach (Control control in Controls)
            control.Click += Control_Click;
    }

    public event EventHandler NoActivity = delegate { };
    private void timer_Tick(object sender, EventArgs e)
    {
        NoActivity(this, EventArgs.Empty);
    }

    private void Control_Click(object sender, EventArgs e)
    {
        timer.Stop();
        timer.Start();
    }

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        timer.Start();
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        timer.Stop();
    }
}

问题:
在调用派生的BasePanel之前调用InitializeComponent()构造函数 由于BasePanel没有自己的控件 - 因此Control_Click事件没有注册控件。

这是正常的继承行为,但仍然 - 如何在基类中注册派生类的控件?

1 个答案:

答案 0 :(得分:0)

这最终解决了这样: 我在BasePanel

中添加了这个递归函数
public void RegisterControls(Control parent)
{
    foreach (Control control in parent.Controls)
    {
        control.Click += Control_Click;
        RegisterControls(control);
    }
}

并在创建这些面板的类中:

private static T CreatePanel<T>()
{
    T panel = Activator.CreateInstance<T>();

    BasePanel basePanel = panel as BasePanel;

    if (basePanel != null)
    {
        basePanel.BackColor = Color.Transparent;
        basePanel.Dock = DockStyle.Fill;
        basePanel.Font = new Font("Arial", 20.25F, FontStyle.Bold, GraphicsUnit.Point, 0);
        basePanel.Margin = new Padding(0);

        basePanel.RegisterControls(basePanel);
    }

    return panel;
}