如何停止仅在XAML中编写的WPF故事板
我在XAML中定义了一个动画(作为用户控件),它实际上每秒在两个图像之间切换:如何停止仅在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"
<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);