【发布时间】:2019-06-08 03:59:59
【问题描述】:
目前这段代码有效,我想它没有按预期工作,因为我还没有弄清楚如何为按钮中的每个不透明度更改强制更新 UI 线程。
private void BtnStart_Click(object sender, RoutedEventArgs e) {
// Create a timer and add its corresponding event
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += TimerFade_Elapsed;
timer.Interval = 750;
// Want a new thread to run this task on so
// the main thread doesn't wait.
Task task = new Task(() => timer.Start());
task.Start();
//r.SingleThread();
}
private void TimerFade_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
// Access UI thread to decrease Opacity on a button from a different thread.
Dispatcher.Invoke(() => {
if (btnStart.Opacity != 0.0) {
btnStart.Opacity -= 1.0;
// code here to force update the GUI.
} else {
System.Timers.Timer t;
t = (System.Timers.Timer)sender;
t.Stop();
}
});
}
代码在视觉上可以正常工作,但事实并非如此。我怀疑这与我在进行更改时没有更新 GUI 有关。
【问题讨论】:
-
你为什么不直接使用动画,也就是故事板?
-
@zackraiyan 这是个好主意,我会调查的!但是,我仍然很好奇如何修复我的原始代码以查看我的不足之处。
-
不透明度的范围为 0.0 到 1.0 (0%..100%),您只需一步即可完成此范围。没有真正褪色;o) 用 btnStart.Opacity -= 1.0 / 20.0 尝试 20 步
-
顺便说一句,您在这里不需要任务。 Timer.Start 方法不会真正阻塞任何东西
-
您提供的代码运行良好。只需更改 btnStart.Opacity -= 1.0;到 btnStart.Opacity -= 0.1;并且您将能够看到该按钮更新缓慢。
标签: c# wpf multithreading task system.timers.timer