我有一个自定义UserControl
,需要在 X 上从 1 缩放到 0,然后使用以下编码从 0 回到 1 Storyboard
:
Storyboard storyboard = new Storyboard();
DoubleAnimation animationFlipBegin = new DoubleAnimation();
animationFlipBegin.BeginTime = TimeSpan.FromSeconds(0.4D);
animationFlipBegin.Duration = TimeSpan.FromSeconds(0.1D);
animationFlipBegin.To = 0D;
animationFlipBegin.SetValue(Storyboard.TargetProperty, myUserControl);
animationFlipBegin.SetValue(Storyboard.TargetPropertyProperty, BuildPropertyPath("(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"));
DoubleAnimation animationFlipEnd = new DoubleAnimation();
animationFlipEnd.BeginTime = TimeSpan.FromSeconds(0.5D);
animationFlipEnd.Duration = TimeSpan.FromSeconds(0.1D);
animationFlipEnd.To = 1D;
animationFlipEnd.SetValue(Storyboard.TargetProperty, myUserControl);
animationFlipEnd.SetValue(Storyboard.TargetPropertyProperty, BuildPropertyPath("(FrameworkElement.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)"));
storyboard.Children.Add(animationFlipBegin);
storyboard.Children.Add(animationFlipEnd);
storyboard.Begin();
当它达到 ScaleX 值 0 时,必须在其上调用一个函数UserControl
。所以我的第一次尝试是添加以下代码:
animationFlipBegin.Completed = new EventHandler(DoAction);
private void DoAction(Object sender, EventArgs e)
{
myUserControl.DoAction();
}
问题是DoAction
仅在Storyboard
完成后才调用,而不是在完成时调用DoubleAnimation
,可能是由于线程......这对我来说绝对不好!
所以......我的第二次尝试是修改我的自定义UserControl
代码如下:
<UserControl.RenderTransform>
<TransformGroup>
<ScaleTransform Core:Name="Scaling" Changed="OnScaleChanged"/>
private void OnScaleChanged(Object sender, EventArgs e)
{
if (Scale.ScaleX == 0D)
DoAction();
}
最初看起来像一个聪明的主意,但事实并非如此。从我看到调试代码的情况来看ScaleTransform.Changed
,有时只会被调用,并且在为 0 时从未调用过。ScaleX
所以......我仍然可以弄清楚的唯一解决方案是将我的Storyboard
分成两个单独Storyboard
的,然后DoAction
在第一个完成后调用事件。太丑了,我真的很想找到另一种方法。请问有什么建议吗?