0

我有一个自定义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在第一个完成后调用事件。太丑了,我真的很想找到另一种方法。请问有什么建议吗?

4

1 回答 1

0

如果您在没有情节提要的情况下单独运行动画怎么办?只需在第一个动画的处理程序中启动第二个动画Completed,没有BeginTime.

var animationFlipBegin = new DoubleAnimation
{
    BeginTime = TimeSpan.FromSeconds(0.4),
    Duration = TimeSpan.FromSeconds(0.1),
    To = 0
};

var animationFlipEnd = new DoubleAnimation
{
    Duration = TimeSpan.FromSeconds(0.1),
    To = 1
};

var scaleTransform = (ScaleTransform)((TransformGroup)RenderTransform).Children[1];

animationFlipBegin.Completed +=
    (o, e) =>
    {
        DoAction();
        scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, animationFlipEnd);
    };

scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, animationFlipBegin);
于 2013-02-22T19:02:32.150 回答