0

有効な値が に入力されたことを示すために使用するストーリーボードがありますTextBox。具体的には、背景を緑に設定し、薄緑にフェードしてから保持します。値が渡されない場合は、ストーリーボードを削除します

テキストが変更されたときに実行する疑似コードは次のとおりです...

if(testPassed)
    PassedAnimationWithHold.Begin(TestTextBox, true);
else // <-- We need a condition here to determine if we actually should remove it or not
    PassedAnimationWithHold.Remove(TestTextBox);

問題は、最初から無効な文字を入力し始めた場合、上記のコードがまだ適用されていないストーリーボードを削除しようとすることです。

独自のブール フラグを追加する以外に、そのストーリーボードが要素でアクティブかどうかをテストする方法はありますか?

アップデート

以下の@sa_ddam213の答えは正しい方向に進んでいるようですが、コメントで指摘したように、それはストーリーボードの最終的なターゲット(の1つ)とアニメーション化されているプロパティの知識に依存します。

たとえば、実際のストーリーボードを考えてみましょう。コントロールに適用されると、その背景が明るい緑に点滅し、アニメーション化された背景色にフェードバックします (注: これは、SolidColorBrush を指定したオブジェクトにのみ適用されることが理解されています。そうしないと、すべてのブラシに「カラー」プロパティがあるわけではないため、これはもちろん失敗します。)

<Storyboard x:Key="{x:Static gr:Storyboards.PassedPulseKey}"
    Storyboard.TargetProperty="Background.Color">

    <ColorAnimation
        From="#F8F8"
        Duration="{StaticResource {x:Static gr:Storyboards.PulseDurationKey}}"
        FillBehavior="Stop" />

</Storyboard>

したがって、彼の手法を使用するには、ストーリーボード適用先オブジェクトの Background プロパティに格納されている SolidColorBrush の Color プロパティの ValueSource で IsAnimated をチェックできるようにする必要があります。ここでまた壁にぶち当たりました。

コードではなく、トリガー付きのスタイルを使用してストーリーボードを適用し、WPF システムに処理させたほうがよいと考え始めています。つまり、トリガーをバインドするには、ViewModel に「Passed」プロパティを追加する必要があります。それでも、できる!

4

1 に答える 1

2

コードで動作するかどうかはわかりませんが、 aの現在の値を返すメソッドがDependencyPropertyHelperあり、現在アニメーション化されているかどうかを確認できます。GetValueSourceDependencyProperty

//
// Summary:
//     Gets a value that declares whether the property is being animated.
//
// Returns:
//     true if the property is animated; otherwise, false.
public bool IsAnimated { get; }

したがって、ストーリーボードTextBoxでアニメーション化する場合はBorderBrush、次を使用できます。

if (DependencyPropertyHelper.GetValueSource(TestTextBox, TextBox.BorderBrushProperty).IsAnimated)
{
   // stop storyboard
}
于 2013-09-25T06:53:58.197 に答える