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()が呼び出される前に呼び出されます。独自のコントロールがないため、コントロールはイベントに登録されませ
ん。 BasePanelControl_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 に答える