如何使用WPF中的卸载事件为控件设置动画

时间:2015-01-08 20:32:22

标签: c# wpf xaml storyboard routed-events

我不想这么快就提出另一个问题,但我似乎无法让这项工作做得很好。

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

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

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

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>

1 个答案:

答案 0 :(得分:0)

我想出了如何解决我的问题。我决定不使用Unloaded事件来制作动画,而是对动画进行程序编码,然后让UserControl订阅Completed的{​​{1}}事件,并且最后触发它自己的删除事件,这将使任何订阅 事件的事件发生(即从视觉DoubleAnimation StackPanel对象列表中删除)。这将允许动画运行,然后,当它完成时,引发删除事件。

这里是代码的混乱。这些方法调用几乎总结了所有这些。它们位于UserControl

UserControl