如何使用 WPF 中的卸载事件对控件进行动画处理
本文关键字:控件 动画 处理 事件 WPF 何使用 卸载 | 更新日期: 2023-09-27 18:37:00
我不想这么快提出另一个问题,但我似乎无法让这个问题完全正确。
我有一个UserControl
,StoryBoard
设置为在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>
我想出了如何解决我的问题。我决定不使用 Unloaded
事件来制作动画,而是以程序方式对动画进行编码,然后让UserControl
订阅该DoubleAnimation
的 Completed
事件,最后触发它自己的 delete 事件,这将使订阅该事件的任何内容发生(即从视觉 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);
}