我正在开发一个包含许多面板的应用程序,所有面板都来自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
事件没有注册控件。
这是正常的继承行为,但仍然 - 如何在基类中注册派生类的控件?
答案 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;
}