在App中,我会显示随着时间的推移或用户点击下一个/上一个时间而旋转的横幅。
1)我需要在Timer.Elapsed
方法中更新UI元素。根据我的发现,似乎计时器滴答在他们自己的线程上执行,元素的调度程序应该用于更新UI。
( (Image)BannerPanel.Content ).Dispatcher.Invoke( new Action( () => {
( (Image)BannerPanel.Content ).Source = GetImage( new Uri( banner.Uri, UriKind.Absolute ) );
} ) );
但会引发InvalidOperationException
。
2)横幅控制器提供Next
和Previous
方法,分别称为显示下一个/上一个横幅。当DisplayBanner
方法尝试显示横幅时,当找不到文件时,它会尝试使用WebClient
的{{1}}重新下载它,并在AsyncFileDownload
上显示图像。我是否正确地假设计时器和DownloadComplete
/ Elapsed
的手动调用同时发生的Next
都可以在他们自己的线程上运行{{1} UI线程上的/ Previous
和Timer线程上的Previous
,可能导致不稳定?
答案 0 :(得分:2)
您应该考虑使用DispatcherTimer
类而不是常规Timer
。它被设计为与WPF UI一起用于这些类型的用途,因为它在Dispatcher
线程上运行。
答案 1 :(得分:1)
尝试使用Application,
Application.Current.Dispatcher.Invoke(new Action(() =>
{
((Image)BannerPanel.Content).Source = GetImage(new Uri(banner.Uri, UriKind.Absolute));
});