我遇到了让计时器更改窗口内容的问题。
我通过以下方式初始化我的计时器:
timeOutTimer = new System.Timers.Timer(15000);
timeOutTimer.Elapsed += new ElapsedEventHandler(timeOutEvent);
timeOutTimer.Enabled = true;
timeOutTimer.AutoReset = false;
timeOutTimer.Start();
我有一个隐藏的ContentControl。
当计时器超过15秒时,它应该改变ContentControl的可见性
private void timeOutEvent(object sender, ElapsedEventArgs e)
{
TicketContent.Visibility = Visibility.Visible;
Console.WriteLine("TIMED OUT");
timeOutTimer.Stop();
}
我得到一个例外: System.InvalidOperationException
我做错了什么?
提前致谢!
答案 0 :(得分:0)
启动计时器时,它从一个单独的非UI线程开始。由于它位于单独的线程中,因此无法访问UI线程中的元素。委托与Dispatcher.BeginInvoke()方法结合使用,可以修改UI元素的属性。
private void timeOutEvent(object sender, ElapsedEventArgs e)
{
TicketContent.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new InvokeDelegate(TimeOutEvent));
Console.WriteLine("TIMED OUT");
timeOutTimer.Stop();
}
public delegate void InvokeDelegate();
private void TimeOutEvent()
{
TicketContent.Visibility = Visibility.Visible;
}
答案 1 :(得分:0)
为什么不使用DispatcherTimer
timer = new DispatcherTimer(
TimeSpan.FromSeconds(15),
DispatcherPriority.Background,
TimeoutEvent,
this.Dispatcher);
timer.Start();