如何使用WPF中的卸载事件动画化控件

问题描述:

我不想这么快就提出另一个问题,但我似乎无法让这工作得很好。如何使用WPF中的卸载事件动画化控件

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

已经有很多代码了,所以我不确定要放置什么。让我知道你希望我为你提供哪些代码来帮助我。

我只有在提出删除(或卸载)事件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> 
+0

我能想到的最简单的方法是使用定时器延迟去除,但我不知道这是最好的一个 –

我想出了如何解决我的问题。我决定不使用Unloaded事件来制作动画,而是程序化编码动画,然后让UserControl订阅Completed事件,并最终触发它自己的删除事件,这会使任何事件订阅事件发生(即从视觉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); 
}