WPF ProgressBar在更新太快时会失去光芒 - bug?

时间:2011-05-08 21:23:23

标签: c# wpf listview animation progress-bar

好的,所以我在弄乱WPF ProgressBar控件时发现了一些相当奇怪的行为。此控件位于ListView控件的列中,一般情况与this question & answer的本质差别很小。

我通过几个属性(ProgressbarMinMax)将Value绑定到一个类,显然所有的OneWay绑定。另一个类从另一个线程更新,并定期使用INotifyPropertyChanged接口让ProgressBar知道状态正在进行。这一切都很棒!

但这是奇怪的地方。我的ProgressBar失去了它的光芒......直到达到Max(= 100%)值。然后它突然开始在绿色条上发出白色发光的东西,这非常令人讨厌。我有理由表现出进步,一旦你开始注意到它不在那里,缺乏脉冲实际上是非常分散注意力。

因此,我开始调试。我发现在我的线程处理Thread.Sleep(1000)时,它仍然隐藏了光芒,但是如果我将它碰到Thread.Sleep(1500),那么光线会随时以强烈的活力回复。之后,我尝试将我的进度单位转换为较小的数字,因此整数值需要更长的时间才能更改。最小0,最大100仍然没有发光。最小0,最大10点的光芒充满活力。在所有情况下,达到100%所花费的工作量和时间相同,但是对于发光显示,这是一个非常明显的二元YES / NO效果。我没有测试的唯一一件事是当ProgressBar没有放在这个ListView控件中时是否也会发生这种情况。

我非常了解自己无法理解(参与XBL)ProgressBar控件的深层WPF内部。所以我希望这里有人知道这是一个已知的bug,他们偶然发现了什么,或者他们甚至可能知道如何解决/修复。

我的机器运行Windows 7,我正在VS2010中开发针对.NET Framework 4 Client Profile。

1 个答案:

答案 0 :(得分:0)

我会猜测并说你失去了光芒,因为你经常更新你的进度条。 每次设置新值时,进度条都会重新启动其发光动画(我想 - 我还没有测试过这个,我正在写下我的头脑)。

似乎你可能已经想到了同样的事情,并试图解决它,但我不确定你已经完全用尽所有可能性:

  1. 尝试创建if(progressbar.Value == newValue)不执行progressbar.Value = newValue;
  2. 的检查
  3. 进度条应该使用小于最小值,最大值,值。确保不对每个小数点进行更新,例如。 - 10,1; 10,2; 10,3; etc ...(使用progressbar.Value =(int)newValue;)
  4. 尝试以更大的增量设置进度条值,而不是增量= 1,使用increment = 10;
  5. 您可以尝试在ListView之外使用进度条,也许有一个渲染错误,其中包含进度条。
  6. PS!如果您非常快速地更新进度条,则可以不运行辉光动画。请记住,辉光动画的目的只是为了表明应用程序仍在运行(机器没有冻结),尽管进度(条形)没有移动。
    如果进度快速移动,那么它本身就是对用户的视觉效果,因此当时不需要有辉光动画......