Как остановить раскадровку WPF, созданную только на XAML - PullRequest
6 голосов
/ 22 марта 2011

У меня есть анимация, определенная в 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>

Она может использоваться в окне таким образом:

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

Моя проблема в том, что когда окно, содержащее анимацию, закрывается, оно продолжает работать и вызывает утечку.Я не могу остановить анимацию с помощью RemoteAnimation_Unloaded () с storyboard.Stop () ... он не работает.

Я проверил оба этих сообщения, но они этого не делаютприменить:

Post1 Post2

Я могу войти в незагруженный метод, но вызов Stop () не останавливает анимацию.Насколько я понимаю, это может быть проблема с вызовом Begin () для раскадровки.Перегрузка с параметром isControlable.Однако, поскольку анимация полностью в XAML, я не уверен, как это повлиять.

Ответы [ 2 ]

12 голосов
/ 23 марта 2011

Похоже, я столкнулся с двумя отдельными проблемами:

Во-первых, в .NET 3.5 анимация раскадровки может вытекать неуправляемую память (тьфу): Ссылка , Ссылка

Поскольку у меня нет возможности обновить мои цели до .NET 4.0, я использовал патч, описанный в ссылках, и он остановил утечку.

Во-вторых, я смог успешно подключиться к событию Unloaded моего UserControl, которое вызывается, когда оно содержит закрытое окно. Я вижу, что у других были проблемы с этим событием, но оно, похоже, работает для меня. Единственный способ остановить анимацию (которая была запущена через XAML с RepeatBehavior из «Навсегда»):

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

Это останавливает анимацию и позволяет ГК собирать ее.

1 голос
/ 22 марта 2011
...