4

私は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();
    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();
}

ボタンを押すと、アニメーションがスライダーを0にスクロールします。TextBoxもスライダーと同期して0に変わります。

そして今、私は問題に直面しています。アニメーションの後、TextBoxのテキストを変更できません。テキストを変更してフォーカスを移動すると、スライダー値のあるテキストが0にリセットされます。引き続きスライダーを移動でき、TextBoxがスライダー値で更新されます。しかし、TextBoxを使用してスライダーの値を設定することはできません。

アニメーションが停止すると、プロパティで指定された値で値がフリーズすると思いますが、フリーズanimation.Toを解除する方法がわかりません。または多分それは何か他のものですか?

4

1 に答える 1

3

これは、依存関係プロパティ値の優先順位が原因で発生します。つまり、アニメーションによって設定された値は、バインディングを介して設定された値よりも「優先順位」が高くなります。

これを回避する方法についてのMSDNからの引用は次のとおりです。

コードでアニメーション化されたプロパティの制御を取り戻す1つの方法は、BeginAnimationメソッドを使用し、AnimationTimelineパラメーターにnullを指定することです。詳細と例については、「方法:ストーリーボードでアニメーション化した後にプロパティを設定する」を参照してください。

于 2011-03-22T19:39:07.393 に答える