如何停止仅在 XAML 中组成的 WPF 故事板 [英] How to stop WPF storyboard composed only in XAML

查看:18
本文介绍了如何停止仅在 XAML 中组成的 WPF 故事板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a animation defined in XAML (as a UserControl) that essentially switches between two images every second:

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

因此可以在窗口中使用:

It can be used in a window thusly:

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

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

My problem is that when the window containing the animation closes, it keeps on running and causes a leak. I'm not able to stop the animation via RemoteAnimation_Unloaded() with storyboard.Stop()... it doesn't do jack.

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

I've checked out both of those posts, but they don't apply:

Post1Post2

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

I am able to get into the unloaded method, but calling Stop() does not stop the animation. From my understanding, it may be an issue with a call to Begin() for the storyboard. There is an overload with an isControlable parameter. However, since the animation is completely in XAML, I'm not sure how to affect this.

推荐答案

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

Looks like I was running into two separate issues:

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

First off, in .NET 3.5, storyboard animations can leak unmanaged memory (ugh): Link, Link

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

Since I don't have the option to update my targets to .NET 4.0, I used the patch described in the links and it has stopped the leak.

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

Second, I was able to successfully hook up to my UserControl's Unloaded event, which is called when it's containing window is closed. I see others have had trouble with this event firing properly, but it seems to work for me. The only way to stop the animation (which was started via XAML with RepeatBehavior of "Forever") is:

storyboard.Begin(this, true);
storyboard.Stop(this);

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

This stops the animation and allows the GC to collect it.

这篇关于如何停止仅在 XAML 中组成的 WPF 故事板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆