How to stop WPF storyboard composed only in XAML

对着背影说爱祢 提交于 2019-12-30 09:24:11

问题


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

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:

Post1 Post2

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.


回答1:


Looks like I was running into two separate issues:

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

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.

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

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




回答2:


Please read these two posts:

Unloaded event not triggered

Disposing UserControls



来源:https://stackoverflow.com/questions/5391838/how-to-stop-wpf-storyboard-composed-only-in-xaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!