C# 如何在WPF中使用卸载的事件设置控件的动画

C# 如何在WPF中使用卸载的事件设置控件的动画,c#,wpf,xaml,storyboard,routed-events,C#,Wpf,Xaml,Storyboard,Routed Events,我不想这么快就提出另一个问题,但我似乎无法让这个问题很好地解决 我有一个用户控件,其中的情节提要设置为在发生卸载的RouteEvent时运行。但是,我也有代码,这样当单击按钮时,它将从其包含的StackPanel中删除UserControl。我希望看到的是,当单击delete按钮时,故事板运行,然后UserControl从StackPanel中移除 已经有很多代码了,所以我不知道该放什么。让我知道你想让我给你写什么代码来帮助我 我所拥有的只是UserControl中引发删除或卸载事件的Route

我不想这么快就提出另一个问题,但我似乎无法让这个问题很好地解决

我有一个用户控件,其中的情节提要设置为在发生卸载的RouteEvent时运行。但是,我也有代码,这样当单击按钮时,它将从其包含的StackPanel中删除UserControl。我希望看到的是,当单击delete按钮时,故事板运行,然后UserControl从StackPanel中移除

已经有很多代码了,所以我不知道该放什么。让我知道你想让我给你写什么代码来帮助我

我所拥有的只是UserControl中引发删除或卸载事件的RouteEvent:

public static readonly RoutedEvent deleteEvent = 
            EventManager.RegisterRoutedEvent("delete", RoutingStrategy.Bubble,
            typeof(RoutedEventHandler), typeof(TimeEntry));

    private void raiseDeleteEvent()
    {
        RoutedEventArgs newDeleteEvent = new RoutedEventArgs(deleteEvent,this);
        RaiseEvent(newDeleteEvent);
    }

    private void deleteButton_Click(object sender, RoutedEventArgs e)
    {

        raiseDeleteEvent();
    }
然后,在主窗口中注册要引发的事件的两个方法:

    private void entryAdder_Click(object sender, RoutedEventArgs e)
    {
        currentSession.addEntry(DateTime.Now);
        scrollStack.Children.Add(currentSession.currentTimeEntry);
        currentSession.currentTimeEntry.delete += currentTimeEntry_delete;
    }

    void currentTimeEntry_delete(object sender, RoutedEventArgs e)
    {
        scrollStack.Children.Remove(sender as TimeEntry);
    }
最后是UserControl及其故事板:


我想出了解决问题的办法。我决定不使用卸载的事件来制作动画,而是按程序对动画进行编码,然后让UserControl订阅该DoubleAnimation的已完成事件,最后触发其自己的删除事件,这将使订阅该事件的任何内容发生,即从visual StackPanel和UserControl对象列表中删除。这将允许动画运行,然后在完成后引发删除事件

这是一堆乱七八糟的代码。这些方法调用基本上概括了这一切。它们位于UserControl中:


我能想到的最简单的方法是使用定时器来延迟移除,但我不知道这是否是最好的方法
        <Storyboard x:Key="Ondelete">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="UserControl">
                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="UserControl">
                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
public static readonly RoutedEvent deleteEvent = EventManager.RegisterRoutedEvent("delete", RoutingStrategy.Bubble,
    typeof(RoutedEventHandler), typeof(TimeEntry));

 private TransformGroup animatedTransform;
 private ScaleTransform animatedScale;

 private DoubleAnimation deleteDoubleAnimation;

 public UserControl()//the constructor
 {
     timeIn = DateTime.Now;
     timeSpent = timeOut - timeIn;
     this.InitializeComponent();
     setUpRenderTransform();
     setUpAnimationVariables();
     deleteDoubleAnimation.Completed += deleteDoubleAnimation_Completed;
 }

private void setUpRenderTransform()
{
    animatedTransform = new TransformGroup();
    animatedScale = new ScaleTransform();
    animatedTransform.Children.Add(animatedScale);

    this.RenderTransform = animatedTransform;

}

private void setUpAnimationVariables()
{
    deleteDoubleAnimation = new DoubleAnimation();
    deleteDoubleAnimation.To = 0;
    deleteDoubleAnimation.Duration = new Duration(TimeSpan.Parse("0:0:.25"));
}

private void raiseDeleteEvent()
{
    RoutedEventArgs newDeleteEvent = new RoutedEventArgs(deleteEvent, this);
    RaiseEvent(newDeleteEvent);
}

private void deleteButton_Click(object sender, RoutedEventArgs e)
{
    deleteAnimation();
}

void deleteDoubleAnimation_Completed(object sender, EventArgs e)
{
    raiseDeleteEvent();
}

private void deleteAnimation()
{
    animatedScale.BeginAnimation(ScaleTransform.ScaleXProperty, deleteDoubleAnimation);
    animatedScale.BeginAnimation(ScaleTransform.ScaleYProperty, deleteDoubleAnimation);
}