2011-08-04 51 views
2

昨天我没有得到答案,但也许我对这个问题的理解不够深入,无法形成正确的问题。故事板动画中的错误?

故事是关于动画列表框高度的动画。下面是随后的屏幕截图:

一) “中” 是一个TextBlock

Image1

b)中 “中等” 的TextBlock得到由列表框代替。用户选择一个项目。这启动了ListBox.Height的动画。动画完成后,ListBox将被原始TextBlock替换。 (忽略数据的差异。图像的采集是不好受的过程,那时我有渲染的帧的工作。其中一个图像被枪杀了不同的记录。)

Img2Img3Img4

该序列偶尔闪烁。我想知道这是怎么回事,一段时间后,我得到这个截图:

Img5

你看到的是后Storyboard.Completed事件被截获的第一帧。据我所知,这是故事板的最终结果。

注:

  • 我查了可视化树在这一瞬间,并没有发现什么suspiceous。

  • 这只是发生的效果之一。另一种常见的情况是带有蓝色阴影的调整大小的1行ListBox;在这种情况下,列表框上的所有元素都消失了。第三种可能性是整个屏幕上的对角红线。

这里是代码定义的故事板:

private Storyboard GetDropDownAnimation(double from, double to) 
    { 
     double secs = this.IsExpanded ? 0.2 : 0.4; 
     CubicEase ease = new CubicEase() { EasingMode = EasingMode.EaseInOut }; 
     DoubleAnimation animation = new DoubleAnimation() 
     { 
      Duration = new Duration(TimeSpan.FromSeconds(secs)), 
      From = from, 
      To = to, 
      FillBehavior = FillBehavior.HoldEnd, 
      EasingFunction = ease 
     }; 
     Debug.WriteLine("Animation Height {0} -> {1}", from, to); 

     Storyboard.SetTarget(animation, this); 
     Storyboard.SetTargetProperty(animation, new PropertyPath("Height")); 

     Storyboard sb = new Storyboard(); 
     sb.Children.Add(animation); 
     return sb; 
    } 

我可以解释其他的技巧进行(很长一段时间我认为这个问题是存在的),但它看起来像问题的担忧只有动画本身。

任何人都可以解释发生了什么事?

回答

2

Have a look at these before you continue this way it might make your life a bit easier :)

这就是说,看看动画(从)的初始值,看看它是否是正确的。

如果一切都失败了,你可以从一个完全透明的列表框开始。

+1

我想你是指这些? http://silverlight.codeplex.com/ –

+0

@克劳斯约根森,是的,谢谢!我的年龄很老。我更新了链接。 –

+0

我查了一下我脑子里想到的一切。从/到动画值被打印到调试输出,我倾销视觉树等一切正常。顺便说一句,错误的“来自”的价值无法解释观察到的效果。 –

0

我在可能值得报告的问题上取得了一些进展。

起初,我用自己的动画取代了Storyboard。我开始使用CompositionTarget.Rendering回调。代码非常简单:在回调中,您需要根据已用时间按比例更新列表框高度。我仔细检查了每个高度变化都有一个LayoutUpdated事件,换句话说,屏幕始终处于同步状态。 (一个惊喜。)

结果:闪烁仍然存在。

结论:故事板是无辜的。

然后我发现了一些有趣的东西: 因为高度操作在我手中,我只是将值四舍五入到整个行高的倍数。并猜测 - 闪烁消失了!

请注意所讨论的ListBox是使用引用字符串属性的ItemsSource和DisplayMemberPath设置的。 ItemTemplate未设置。换句话说,非常标准的ListBox使用。

这不是一个答案,我知道,但我觉得它很有趣。

+0

显然,当我的项目不适合'它会从列表框中删除,这意味着ItemsContainer模板已损坏。 –

+0

不知道你的模板是什么意思。我使用预定义模板的标准ListBox。 –

+0

我很有可能再次犯错。与此同时,我发现闪烁没有消失,变得极其罕见。而这又可能是有限数量的动画步骤的结果。 –