发生此错误是因为Timer
事件在与 UI 线程不同的线程上触发。您可以通过以下两种方式之一更改 UI 元素。首先是告诉Dispatcher
对象在 UI 线程上执行代码。如果您的对象Timer
是一个DependencyObject
(例如PhoneApplicationPage
),您可以使用该Dispatcher
属性。这是通过BeginInvoke
方法完成的。
void ClearClipboard(object o)
{
Dispatcher.BeginInvoke(() => Clipboard.SetText(""));
}
如果你的对象不是DependencyObject
,你可以使用Deployment
对象来访问Dispatcher
。
void ClearClipboard(object o)
{
Deployment.Current.Dispatcher.BeginInvoke(() => Clipboard.SetText(""));
}
第二个选项是使用DispatcherTimer
代替Timer
。该DispatcherTimer
事件确实在 UI 线程上触发!
// Create the timer
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(3);
timer.Tick += TimerOnTick;
// The subscription method
private void TimerOnTick(object sender, EventArgs eventArgs)
{
Clipboard.SetText("");
}