如何停止仅在XAML中组成的WPF故事板

Bab*_*oey 6 wpf animation xaml user-controls storyboard

我有一个在XAML中定义的动画(作为UserControl),它实际上每秒在两个图像之间切换:

    <UserControl x:Class="KaleidoscopeApplication.Controls.RemoteAnimation"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Loaded="RemoteAnimation_Loaded"
    Unloaded="RemoteAnimation_Unloaded">

    <Grid Canvas.Left="500" Canvas.Top="84">
        <Grid.Triggers>
            <EventTrigger RoutedEvent="Grid.Loaded">
                <BeginStoryboard>
                    <Storyboard x:Name="storyboard"  RepeatBehavior="Forever">
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="remote2" BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Visibility)">
                            <DiscreteObjectKeyFrame KeyTime="0:0:1">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Collapsed</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                            <DiscreteObjectKeyFrame KeyTime="0:0:2">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Visible</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Grid.Triggers>

        <Image Name="remote1" Source="/Resources/Elements/Images/341.png"/>
        <Image Name="remote2" Source="/Resources/Elements/Images/342.png"/>

    </Grid>

</UserControl>
Run Code Online (Sandbox Code Playgroud)

它可以在窗口中使用:

<!-- Remote -->
<uControl:RemoteAnimation 
     x:Name="remoteAnimation"
     Canvas.Left="316" Canvas.Top="156" Height="246" Width="121" />
Run Code Online (Sandbox Code Playgroud)

我的问题是,当包含动画的窗口关闭时,它会继续运行并导致泄漏.我无法通过带有storyboard.Stop()的RemoteAnimation_Unloaded()来停止动画......它不会做插孔.

我已经检查了这两个帖子,但它们不适用:

Post1 Post2

我能够进入卸载方法,但调用Stop()不会停止动画.根据我的理解,对于故事板调用Begin()可能是一个问题.isControlable参数存在重载.但是,由于动画完全在XAML中,我不确定如何影响它.

Bab*_*oey 12

看起来我遇到了两个不同的问题:

首先,在.NET 3.5中,故事板动画可以泄漏非托管内存(呃): 链接,链接

由于我没有选择将我的目标更新到.NET 4.0,我使用了链接中描述的补丁,它已经阻止了泄漏.

其次,我能够成功连接到我的UserControl的Unloaded事件,该事件在包含窗口关闭时被调用.我看到其他人在这个事件正常射击时遇到了麻烦,但它似乎对我有用.停止动画的唯一方法(通过XAML使用RepeatBehavior"Forever"启动)是:

storyboard.Begin(this, true);
storyboard.Stop(this);
Run Code Online (Sandbox Code Playgroud)

这会停止动画并允许GC收集它.

  • 谢谢,我正在寻找一种方法来阻止我的"永远"动画,但只是调用Stop(这个)没有这样做.在Start(this)方法中添加"true"就可以了. (2认同)