有关动画和双向绑定的问题

时间:2011-03-22 19:08:47

标签: wpf binding

我正在玩WPF动画并面临一些有线问题。

我有一个Slider和一个TextBox。使用双向绑定将TextBox绑定到Slider.Value:

<StackPanel>
    <Slider x:Name="MySlider" Minimum="0" Maximum="100" Value="50" />
    <TextBox Text="{Binding ElementName=MySlider, Path=Value, Mode=TwoWay}" />
    <Button Click="Button_Click">Test</Button>
</StackPanel>

当我拖动滑块时,文本框中的文字会发生变化。当我在文本框中更改文本时,滑块的值会更新,它可以正常工作。

现在我添加一个动画,它将Slider.Value属性设置为0.我按下按钮启动它。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Storyboard storyBoard = new Storyboard();
        DoubleAnimation animation = new DoubleAnimation();

        animation.Duration = new Duration(TimeSpan.FromSeconds(0.5));
        animation.To = 0;

        Storyboard.SetTarget(animation, MySlider);
        Storyboard.SetTargetProperty(animation, new PropertyPath(Slider.ValueProperty));

        storyBoard.Children.Add(animation);

        storyBoard.Begin();
    }

当我按下按钮时,动画将Slider滚动到0. TextBox也会更改为0同步woth滑块。

现在我面临着这个问题。动画后,我无法更改文本框中的文本。我更改文本,移动焦点和文本,滑块值重置为0.我仍然可以移动滑块,文本框更新滑块值。但我无法使用文本框设置滑块值。

我认为当动画停止时,值会以某种方式冻结在animation.To属性中指定的值,但我无法弄清楚如何解冻它。或者可能是别的什么?

谢谢

1 个答案:

答案 0 :(得分:3)

这是因为依赖属性值优先,这意味着动画设置的值比通过绑定设置的值具有更高的“优先级”。

以下是MSDN关于如何解决此问题的报价:

  

重新获得控制权的一种方法   代码中的动画属性是使用   BeginAnimation方法并指定   null为AnimationTimeline   参数。有关更多信息和   例如,请参阅How to: Set a Property After Animating It with a Storyboard