Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何停止仅在XAML中编写的WPF故事板_Wpf_Xaml_Animation_User Controls_Storyboard - Fatal编程技术网

如何停止仅在XAML中编写的WPF故事板

如何停止仅在XAML中编写的WPF故事板,wpf,xaml,animation,user-controls,storyboard,Wpf,Xaml,Animation,User Controls,Storyboard,我在XAML中定义了一个动画(作为用户控件),它实际上每秒在两个图像之间切换: <UserControl x:Class="KaleidoscopeApplication.Controls.RemoteAnimation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我在XAML中定义了一个动画(作为用户控件),它实际上每秒在两个图像之间切换:

    <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>

崩溃
看得见的
它可以在窗口中使用,因此:

<!-- Remote -->
<uControl:RemoteAnimation 
     x:Name="remoteAnimation"
     Canvas.Left="316" Canvas.Top="156" Height="246" Width="121" />

我的问题是,当包含动画的窗口关闭时,它会继续运行并导致泄漏。我无法通过带有storyboard.stop()的RemoteAnimation_unload()停止动画。。。这不适合杰克


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


我可以进入unload方法,但是调用Stop()并不能停止动画。根据我的理解,调用故事板的Begin()可能有问题。有一个带有IsControl参数的重载。然而,由于动画完全是在XAML中,我不知道如何影响它

请阅读以下两篇帖子:


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

首先,在.NET 3.5中,情节提要动画可能会泄漏非托管内存(ugh): ,

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

其次,我能够成功地连接到UserControl的卸载事件,当它包含的窗口关闭时调用该事件。我看到其他人对此事件的正确触发有困难,但它似乎对我有效。停止动画(通过XAML以“永远”的
RepeatBehavior
启动)的唯一方法是:


这将停止动画,并允许GC收集动画。

我已检查了这两个选项,但它们不适用。我可以进入unload方法,但是调用Stop()并不能停止动画。根据我的理解,调用故事板的Begin()可能有问题。有一个带有IsControl参数的重载。但是,由于动画完全是用XAML制作的,我不知道如何影响它。为什么不把它添加到问题中?请现在就做。不要掷骰子。。。那个混蛋一直在跑。为什么它不能听自己的Stop()方法呢?!:)顺便说一句:你怎么知道它一直在运行,并导致内存泄漏?谢谢,我一直在寻找一种方法来停止我的“永远”动画,但只是调用停止(这个)没有做到这一点。将“true”添加到Start(this)方法中就成功了。Begin方法的这种带有12个重载的不明显的API设计也吸引了我。默认设置应该是可控的,因为根据定义,动画是动态的,并且很难使用纯xaml appraoach。
storyboard.Begin(this, true);
storyboard.Stop(this);