-1

我不确定这是否是一个好主意,这可能最终会成为更多的学术练习,所以请耐心等待:

假设我正在制作一个 UserControl(就像我一样),它将每隔 X 秒(使用 Timer)查找一个文本文件并在此 UserControl 中显示该信息。我们将此控件称为 MyUserControl。

重新散列基本信息:

我会将这个 Timer 作为该控件的成员变量,并且代码如下所示:

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

还有一个如下所示的事件处理程序方法:

private void timer1_Tick(object sender, EventArgs e)
{
    // Read text-file and do lots of goodness.
}

很酷,所以现在我可以将 MyUserControl 的公共属性设置为某个经过的时间,并且只需将这个控件放在我的表单上,我就有一个不错的小控件更新自身。整洁的。

这是让我好奇的事情:

我要把它放在上面的表格已经有一个计时器。那么为什么有两个相互竞争的计时器呢?我希望有一种方法让 MyUserControl 只在需要时使用它的内部计时器(例如,将它放在另一个还没有计时器的表单上)。

我想我可以在这里公开 MyUserControl timer1_Tick:

public void timer1_Tick(object sender, EventArgs e)
{
    // Read text-file and do lots of goodness.
}

然后,因为这些东西是多播的,所以在这里做这样的事情:

this.theFormTimer.Tick += new System.EventHandler(this.theFormTimer_Tick);
this.theFormTimer.Tick += new System.EventHandler(MyUserControlObject.timer1_Tick);

并且还将 MyUserControl 的成员变量设置为不启用自身。

但是有没有更巧妙的方法来做到这一点?我能否以某种方式确定 MyUserControl 中的事件处理程序方法已连接到 Form Timer 的滴答事件?或者使用其他类型的方法而不是我建议的方法?

谢谢!(抱歉,如果这最终是重复的,我的 google-fu 今天可能很糟糕)

4

1 回答 1

1

不讨论你是否应该这样做,但为了回答这个问题,我会这样做:

//add a handler
timer.Tick += timer_tick;

//...

//check if timer_tick is wired to Tick
if (timer.Tick.GetInvocationList().Contains (timer_tick))
{
    //do something
}

我还没有测试过,但这就是我要尝试的。

于 2013-09-05T08:36:12.087 回答