如何使用 WPF 中的卸载事件对控件进行动画处理

本文关键字:控件 动画 处理 事件 WPF 何使用 卸载 | 更新日期: 2023-09-27 18:37:00

我不想这么快提出另一个问题,但我似乎无法让这个问题完全正确。

我有一个UserControlStoryBoard设置为在Unloaded RoutedEvent发生时运行。但是,我也有代码,以便在单击按钮时,它将从其包含StackPanel中删除UserControl。我希望看到的是,当单击该删除按钮时,StoryBoard运行,然后StackPanel中删除UserControl

已经有很多代码了,所以我不确定要放置什么。让我知道您希望我放置什么代码以帮助您帮助我。

我所拥有的只是引发删除(或卸载)事件的UserControl RoutedEvent

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,及其StoryBoard s:

        <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>

如何使用 WPF 中的卸载事件对控件进行动画处理

我想出了如何解决我的问题。我决定不使用 Unloaded 事件来制作动画,而是以程序方式对动画进行编码,然后让UserControl订阅该DoubleAnimationCompleted 事件,最后触发它自己的 delete 事件,这将使订阅事件的任何内容发生(即从视觉 StackPanelUserControl对象列表中删除)。这将允许动画运行,然后在完成后引发删除事件。

这是一堆代码。这些方法调用几乎总结了这一切。它们位于UserControl内:

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);
}