如何使用WPF中的卸载事件动画化控件
问题描述:
我不想这么快就提出另一个问题,但我似乎无法让这工作得很好。如何使用WPF中的卸载事件动画化控件
我有一个UserControl
与StoryBoard
设置为Unloaded RoutedEvent
发生时运行。但是,我也有该代码,以便在单击按钮时从其包含StackPanel
中删除UserControl
。我想看到的情况是,当点击删除按钮时,StoryBoard
运行,,然后UserControl
从StackPanel
中删除。
已经有很多代码了,所以我不确定要放置什么。让我知道你希望我为你提供哪些代码来帮助我。
我只有在提出删除(或卸载)事件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>
答
我想出了如何解决我的问题。我决定不使用Unloaded
事件来制作动画,而是程序化编码动画,然后让UserControl
订阅Completed
事件,并最终触发它自己的删除事件,这会使任何事件订阅事件发生(即从视觉StackPanel
和UserControl
对象列表中删除)。这将允许动画运行,然后在完成时引发删除事件。
下面是代码的混乱。这些方法调用几乎总结了这些。他们位于内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);
}
我能想到的最简单的方法是使用定时器延迟去除,但我不知道这是最好的一个 –