【发布时间】:2011-08-18 21:58:08
【问题描述】:
我有两个重叠(在相同位置,具有相同大小)的 MediaElement。它们将包含图像。一个元素的不透明度将设置为 1.0,而另一个元素的不透明度将设置为 0.0。这里的想法是幻灯片类型交易的简单过渡。当需要显示下一张幻灯片时,背景元素会加载一张图片,并且两个元素的不透明度会逐渐切换。
我尝试(成功地)使用 System.Timers 实现此行为,但发现在同一应用程序中拥有多个任意数量的计时器会导致 .NET 随机生成并将 timer_elapsed 的控制权交给几个不同的线程。这导致了不可预测的结果,并且通常让我怀疑自己的理智。
所以,我决定做同样的事情,但使用 System.Threads 和它们的 Sleep 函数。无论出于何种原因,逐渐循环不透明度与疯狂的计时器完美配合,但与线程完全失败。它以一种荒谬的方式失败了。两个元素的不透明度确实发生了变化,但两者之间没有变化。元素以 1.0 或 0.0 的不透明度显示。否则我会注意到大约一半的图片没有被循环播放。
经过多次谷歌搜索,我认为可能发生不透明度更改的线程的优先级以某种方式阻止 UI 元素立即呈现。但后来我回想起来,因为我在媒体元素上使用调度程序调用,所以所有的操作都发生在主线程上,所以不会有什么不同。
【问题讨论】:
-
为什么要手动而不是通过情节提要动画?
-
缺乏 WPF 经验。考虑到在整个过程中我被要求忍受的废话的数量,我可能最终还是会走那条路。我真的很想知道为什么这种合乎逻辑的东西不起作用。
标签: c# wpf multithreading opacity