none
如何让WPF动画没执行完,不再触发动画 RRS feed

  • 问题

  • 我做了一个旋转动画。鼠标移上去就旋转,但是还没旋转完我的鼠标再次移动上去,就又从头开始旋转了,怎么才能动画没执行完,鼠标再次移上去就不再触发动画
    2014年8月1日 4:08

答案

  • 你可以设置一个变量 比如 Private bool _CanRotate=true;

    比如你的动画是写在MouseEnter事件中,

    首先在MouseEnter中判断_CanRotate是否为true,如果是false就return掉,不执行动画.如果是true就把_CanRotate设置为false,

    然后再执行动画

    给你的动画注册Completed事件,动画结束在把_CanRotate设置为true.

    这样就确保,在动画未结束前,不再进行动画.

    当然,你也可以把整个窗口的IsHitTestVisible设置为false,这样整个窗口就无法被命中,效果和上面的差不多.我推荐还是用上面的方法


    与我交流:点击这里给我发消息


    • 已编辑 HeroHua0509 2014年8月1日 4:32
    • 已标记为答案 roomanl 2014年8月8日 7:04
    2014年8月1日 4:31
  • 可以考虑不设置from属性。

    设置To属性可以确定你的动画的目标。

    设置By属性可以确定你的动画的跨度,但鼠标移入会重置By的值和Duration的值。

    以上两种方式均能够解决动画从头开始播放的问题,而都是改为重置时间后继续播放……

    如果你对这两种方法都不满意的话,还有一种办法,就是自定义事件。

    可以自定义一个Rotate路由事件,在MouseEnter事件中判断条件(嗯,就像HeroHua0509说的_CanRotate什么的)触发。而你的动画部分就可以通过Rotate事件触发,这样还是会用到后台代码,但是动画部分就可以完全用标签来写了。

    我是不记得DoubleAnimation或Storyboard中是否有属性能够满足你的要求,暂时能想到的办法就这些了。

    如果你还有什么疑问可以提出来一起讨论,如果你有什么更好的解决办法也请分享给大家。


    • 已编辑 Lymim 2014年8月1日 6:16 编辑出错
    • 已标记为答案 roomanl 2014年8月8日 7:04
    2014年8月1日 6:16

全部回复

  • 你可以设置一个变量 比如 Private bool _CanRotate=true;

    比如你的动画是写在MouseEnter事件中,

    首先在MouseEnter中判断_CanRotate是否为true,如果是false就return掉,不执行动画.如果是true就把_CanRotate设置为false,

    然后再执行动画

    给你的动画注册Completed事件,动画结束在把_CanRotate设置为true.

    这样就确保,在动画未结束前,不再进行动画.

    当然,你也可以把整个窗口的IsHitTestVisible设置为false,这样整个窗口就无法被命中,效果和上面的差不多.我推荐还是用上面的方法


    与我交流:点击这里给我发消息


    • 已编辑 HeroHua0509 2014年8月1日 4:32
    • 已标记为答案 roomanl 2014年8月8日 7:04
    2014年8月1日 4:31
  • 这个办法是可以,但我只想在前台实现,不要在后台实现。
    2014年8月1日 5:00
  • 可以考虑不设置from属性。

    设置To属性可以确定你的动画的目标。

    设置By属性可以确定你的动画的跨度,但鼠标移入会重置By的值和Duration的值。

    以上两种方式均能够解决动画从头开始播放的问题,而都是改为重置时间后继续播放……

    如果你对这两种方法都不满意的话,还有一种办法,就是自定义事件。

    可以自定义一个Rotate路由事件,在MouseEnter事件中判断条件(嗯,就像HeroHua0509说的_CanRotate什么的)触发。而你的动画部分就可以通过Rotate事件触发,这样还是会用到后台代码,但是动画部分就可以完全用标签来写了。

    我是不记得DoubleAnimation或Storyboard中是否有属性能够满足你的要求,暂时能想到的办法就这些了。

    如果你还有什么疑问可以提出来一起讨论,如果你有什么更好的解决办法也请分享给大家。


    • 已编辑 Lymim 2014年8月1日 6:16 编辑出错
    • 已标记为答案 roomanl 2014年8月8日 7:04
    2014年8月1日 6:16