情节提要中未正确触发事件

本文关键字:事件 | 更新日期: 2023-09-27 18:00:31

我有一个自定义的UserControl,它需要在X上从1缩放到0,然后使用以下编码的Storyboard:从0返回到1

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只在某些时候被调用,当ScaleX为0时,它从未被调用过,这是我在调试代码时看到的。

所以。。。我仍然能想出的唯一解决方案是将我的Storyboard拆分为两个单独的Storyboard,然后在第一个事件完成后调用DoAction事件。它太难看了,我真的想找到另一种方式。有什么建议吗?

情节提要中未正确触发事件

如果在没有情节提要的情况下单独运行动画会怎么样?只需在第一个动画的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);