我刚刚为Coding4Fun项目添加了一些额外的功能。我的项目设置了一个额外的选项,允许它在X时间后自动更改背景。 X是从ComboBox设置的。但是,我知道我已经以一种可怕的方式完成了这项工作,因为我创建了一个新的计时器类,并将System.Timers.Timer作为父级,因此当调用ElapsedEventHandler中的静态方法时,我能够回到表单并调用ChangeDesktopBackground()。
以用户定义的时间间隔调用ChangeDesktopBackground()的更好方法是什么?
这是我当前的解决方案,它涉及我将发送者作为我的继承计时器,然后获取对表单的引用,然后调用ChangeDesktopBackground方法。
private static void timerEvent(object sender, System.Timers.ElapsedEventArgs e)
{
((newTimer)sender).getCycleSettingsForm().ChangeDesktopBackground();
}
编辑:添加编码样本以显示当前解决方案
答案 0 :(得分:0)
计时器可能是最直接的方式,虽然我不确定你是否正确使用计时器。以下是我在项目中使用计时器的方法:
// here we declare the timer that this class will use.
private Timer timer;
//I've shown the timer creation inside the constructor of a main form,
//but it may be done elsewhere depending on your needs
public Main()
{
// other init stuff omitted
timer = new Timer();
timer.Interval = 10000; // 10 seconds between images
timer.Tick += timer_Tick; // attach the event handler (defined below)
}
void timer_Tick(object sender, EventArgs e)
{
// this is where you'd show your next image
}
然后,你将连接你的ComboBox onChange处理程序,这样你就可以改变timer.Interval。
答案 1 :(得分:0)
我在自己之前写过类似的东西。 System.Timers.Timer对此有点矫枉过正。你可能应该使用System.Windows.Forms.Timer,原因有两个:
答案 2 :(得分:0)
我会使用微软的Reactive Framework来实现这个目标。只是NuGet“Rx-WinForms”。
以下是代码:
=TRIM(REPT("\lvl", MATCH("zzz", A2:D2)-1)&CHAR(32)&INDEX(A2:D2, MATCH("zzz", A2:D2)))
要停止它,只需var subscription =
Observable
.Interval(TimeSpan.FromMinutes(1.0))
.ObserveOn(this)
.Subscribe(n => this.getCycleSettingsForm().ChangeDesktopBackground());
。
简单。