【问题标题】:Animation and 2-way binding动画和 2 向绑定
【发布时间】:2011-07-20 18:30:09
【问题描述】:

我正在玩 WPF 动画,遇到了一个奇怪的问题。

我有一个Slider 和一个TextBox。 TextBox 使用 2-way binding 绑定到 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();
    var 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 也与 slider 同步更改为 0。

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

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

【问题讨论】:

    标签: wpf binding slider dependency-properties wpf-animation


    【解决方案1】:

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

    这是 MSDN 关于如何解决此问题的引述:

    重新获得控制权的一种方法 代码中的动画属性是使用 BeginAnimation 方法并指定 动画时间线为 null 范围。如需更多信息和 例如,参见How to: Set a Property After Animating It with a Storyboard

    【讨论】:

    • 谢谢,这个链接很有帮助!
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2017-07-25
    • 2022-07-21
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多