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