代码后台执行Slider动画后无法重置其值
问题根源
这是WPF动画系统里的常见坑——当你通过BeginAnimation给依赖属性(比如Slider的Value)应用动画后,动画会接管该属性的控制权,哪怕动画已经播放完成。默认情况下,动画的FillBehavior是HoldEnd,这会让属性一直保持动画的最后一帧值,这时候你直接给Slider.Value赋值根本不会生效,因为动画的优先级比直接赋值高得多。
解决方案
要解决这个问题,你得先移除动画对Value属性的控制,之后再设置值就行。具体操作是调用BeginAnimation并传入null作为动画参数,这样就能清除该属性上的所有动画绑定,让属性回到可直接修改的状态。
修改后的重置按钮代码如下:
private void Button_Click_1(object sender, RoutedEventArgs e) { // 先移除每个Slider的Value属性上的动画控制 sld_1.BeginAnimation(Slider.ValueProperty, null); sld_2.BeginAnimation(Slider.ValueProperty, null); sld_3.BeginAnimation(Slider.ValueProperty, null); // 现在可以正常设置值了 sld_1.Value = 1; sld_2.Value = 1; sld_3.Value = 1; MessageBox.Show(sld_1.Value.ToString()); MessageBox.Show(sld_2.Value.ToString()); MessageBox.Show(sld_3.Value.ToString()); }
额外说明
如果你希望动画结束后自动释放属性控制权(不需要保持最后一帧的值),也可以在创建动画时设置FillBehavior为Stop,这样动画播放完毕后,Slider会回到动画开始前的初始值。比如:
DoubleAnimation sld_1anim = new DoubleAnimation(100, TimeSpan.FromMilliseconds(1000)); sld_1anim.FillBehavior = FillBehavior.Stop; // 添加这一行 sld_1.BeginAnimation(Slider.ValueProperty, sld_1anim);
不过这种方式只适用于你不需要动画结束后停在目标值的场景,根据你的需求,第一种移除动画的方案显然更合适。
内容的提问来源于stack exchange,提问作者Samuel Hardson
相关产品推荐
相关产品推荐

