本帖最后由 Alice 于 2016-5-11 14:59 编辑
根据你的Demo来看,通过动画修改Value的值,是会触发ValueChanged事件。
然后你的Demo中死循环调用。
为了避免死循环,那就在ValueChanged事件中加入一些判断,不要启动很多动画。一个思路,判断是否是5的倍数,如果是5的倍数,就启动动画,不是就不启动动画。
提供两个思路, 效果不一样,给你参考下。
1. ValueChanged肯定会一直触发的,因为动画是修改Value属性的。而ValueChanged事件的触发时机是Value改变。所以触发多次是正常的。至于抛exception, 原因是执行动画后,使得Value的值一直在改变,频率快于绘画的速度,所以抛Exception, 可以让动画在Dispatcher中启动。
- <p>private void MachineSpeedMeter_ValueChanged(object sender, C1.WPF.PropertyChangedEventArgs<double> e)</p><p>//点击一次按钮改变Value值后,该事件循环触发
- {
- Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
- {
- var da = new DoubleAnimation(e.OldValue, e.NewValue, new TimeSpan(0, 0, 0, 2));
- var st = (Storyboard)this.FindResource("story0");
- st.Children.Add(da);
- this.BeginStoryboard(rain);
- }));
- }</p>
复制代码
这样的效果是:指针一直在快速的晃动。
第二种思路:
如果想让动画从0 到 5, 然后再从5 到 0 , 然后再从0 到5 这样循环,
可以在Storyboard的Completed的事件中在启动动画,但是此时From和To是相反的。
- private void St_Completed(object sender, EventArgs e)
- {
- Storyboard st = (Storyboard)this.FindResource("story0");
- var child = st.Children[0] as DoubleAnimation;
- var da = new DoubleAnimation(child.To.Value, child.From.Value, new TimeSpan(0, 0, 0, 2));
- st.Children.Clear();
- st.Children.Add(da);
- this.BeginStoryboard(rain);
- }
复制代码
在加速按钮中启动动画。
- private void button_Click(object sender, RoutedEventArgs e)
- {
- //MachineSpeedMeter.Value += 5D;
- Storyboard st = (Storyboard)this.FindResource("story0");
- st.Stop();
- st.Children.Clear();
- DoubleAnimation da = new DoubleAnimation(MachineSpeedMeter.Value, MachineSpeedMeter.Value + 5D, new TimeSpan(0, 0, 0, 2));
- st.Children.Add(da);
- st.Completed += St_Completed;
- this.BeginStoryboard(rain);
- }
复制代码 |