停止 WPF 动画,故事板从 xaml 开始,但在代码隐藏中停止?
我在 xaml 文件中创建了一个动画故事板。该故事板从 Button.Click 开始。但为了停止动画,我试图在后面的代码中停止我的自定义事件的故事板。 代码没有抛出任何异常,但是当我的事件被触发时,动画仍然继续。
我认为问题出在 Stop 方法上。停止需要与开始动画相同的对象来停止它。但这里的故事板是在 WPF xaml 中开始的,我在后面的代码中停止它。
任何解决方案,如何在代码后面获取 Xaml 对象或任何替代解决方案?
XAML 代码:
<Canvas.Triggers>
<EventTrigger RoutedEvent="Button.Click" SourceName="ScanButton">
<EventTrigger.Actions>
<BeginStoryboard >
<Storyboard Name="MovingServer" Storyboard.TargetName="ImageMove" RepeatBehavior="Forever" >
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="30" To="300" BeginTime="0:0:0" />
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:5" From="300" To="300" BeginTime="0:0:5" />
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="300" To="600" BeginTime="0:0:7" />
<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:2" From="1" To="0" BeginTime="0:0:7" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
背后代码:
private void EventPublisher_OnScanningFinish(object sender, EventArgs args)
{
Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() { this.StopScanningAnimation(); });
}
private void StopScanningAnimation()
{
ServerView.StoryBoardServerScrolling.Stop(this); //---------- Not Working
//this.ServerView.Server1Static.Visibility = System.Windows.Visibility.Hidden;
//this.ServerView.Server2Static.Visibility = System.Windows.Visibility.Hidden;
//this.ServerView.Server3Scrolling.Visibility = System.Windows.Visibility.Hidden;
//this.ServerView.SearchingGlass.Visibility = System.Windows.Visibility.Hidden;
}
I created an animation storyboard in xaml file. That story board begins on Button.Click. But to stop the animation I am trying to stop storyboard on my custom event in code behind.
The code is not throwing any exception but When my event got fired the animation still goes continue.
I think the issue is with the Stop method. Stop required the same object that begins the animation to stop it. But here the storyboard is begin in WPF xaml and I am stopping it in code behind.
Any Solution, how to get Xaml object in code behind or Any alternative solution for this??
XAML CODE:
<Canvas.Triggers>
<EventTrigger RoutedEvent="Button.Click" SourceName="ScanButton">
<EventTrigger.Actions>
<BeginStoryboard >
<Storyboard Name="MovingServer" Storyboard.TargetName="ImageMove" RepeatBehavior="Forever" >
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="30" To="300" BeginTime="0:0:0" />
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:5" From="300" To="300" BeginTime="0:0:5" />
<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="300" To="600" BeginTime="0:0:7" />
<DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:2" From="1" To="0" BeginTime="0:0:7" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
Code Behind:
private void EventPublisher_OnScanningFinish(object sender, EventArgs args)
{
Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() { this.StopScanningAnimation(); });
}
private void StopScanningAnimation()
{
ServerView.StoryBoardServerScrolling.Stop(this); //---------- Not Working
//this.ServerView.Server1Static.Visibility = System.Windows.Visibility.Hidden;
//this.ServerView.Server2Static.Visibility = System.Windows.Visibility.Hidden;
//this.ServerView.Server3Scrolling.Visibility = System.Windows.Visibility.Hidden;
//this.ServerView.SearchingGlass.Visibility = System.Windows.Visibility.Hidden;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
将故事板定义为静态资源,
并从后端代码中引用它,如下所示:
从按钮的“单击”事件启动动画(我不知道您是否在 xaml 中定义,但如果你做到了)
Define the storyboard as a static resource,
and reference it from your backend code as follows :
start the animation from the 'click' event of the button (i don't know if you defined in xaml, but here's how it would be done if you did)
我很感谢蒂莫西提出了好主意。在这里我发布我的工作代码
I am thankful for Timothy for giving nice Idea. Here I am posting my working code
我通过使用 Storyboard 类的
Stop()
方法解决了这个问题,这样您就不必在资源中声明 Storyboard。
I solve the problem with using the
Stop()
method of Storyboard class like thiswith this solution you don't have to declare Storyboard at the resource.