昨天我没有得到答案,但也许我对这个问题的理解不够深入,无法提出正确的问题。
故事是关于动画ListBox高度。以下是后续截图:
a)“中”是一个TextBlock
b)“中”TextBlock被ListBox取代。用户选择一个项目。这将启动ListBox.Height的动画。动画完成后,ListBox将替换为原始TextBlock。 (无视数据的差异。当我不得不使用渲染帧时,图像的收集是一个痛苦的过程。其中一个图像是为不同的记录拍摄的。)
此序列适用于偶尔的闪烁。我想知道发生了什么,过了一段时间我得到了这个截图:
你看到的是截获Storyboard.Completed事件后的第一帧。据我所知,这是故事板的最终结果。
注意:
我在这一刻检查了视觉树,没有发现任何可疑之处。
这只是其中一种影响。另一个常见的案例是带有蓝色阴影的大小调整的1行ListBox;在这种情况下,列表框上方的所有元素都会消失。第三种可能性是整个屏幕上的对角红线。
以下是定义Storyboard的代码:
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;
}
我可以解释其他技巧(很长一段时间我都确信存在问题),但看起来这个问题只涉及动画本身。
任何人都能解释发生了什么事吗?
答案 0 :(得分:2)
Have a look at these before you continue this way it might make your life a bit easier :)
那说,看一下动画的起始值(从),看看它是否正确。
如果所有其他方法都失败了,您可以从完全透明的列表框开始。
答案 1 :(得分:0)
我在可能值得报道的问题上取得了一些进展。
起初我用自己的动画取代了Storyboard。我开始使用CompositionTarget.Rendering回调。代码相当简单:在回调中,您需要按经过时间的比例更新ListBox高度。我仔细检查了每次高度变化都有一个LayoutUpdated事件,换句话说,屏幕始终处于同步状态。 (一个惊喜。)
结果:闪烁仍然存在。
结论:故事板是无辜的。
然后我发现了一些有趣的东西: 因为高度操作在我手中,我只是将值四舍五入到行高的整数倍。猜猜是什么 - 闪烁消失了!
请注意,有问题的ListBox是使用引用字符串属性的ItemsSource和DisplayMemberPath设置的。未设置ItemTemplate。换句话说,使用相当标准的ListBox。
这不是答案,我知道,但我发现它很有趣。