0

我正在开发一个具有许多面板的应用程序,这些面板都来自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事件。

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

4

1 回答 1

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;
}
于 2012-09-08T06:40:29.103 回答