1

ViewModel からの新しい値に応じて、テキスト ボックス (価格) の背景色をアニメーション化したいと考えています。

色は新しい値によって異なります (0 より大きい -> 緑 - 0 より小さい -> 赤)。

私が見ることができる唯一のアニメーションは、新しい値が設定されたときの起動時です。その後、アニメーションは二度と表示されません。

<TextBox HorizontalAlignment="Left" Height="23" Margin="10,178,0,0" TextWrapping="Wrap" Text="{Binding price}" VerticalAlignment="Top" Width="120" x:Name="ChangeField">
    <TextBox.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding price, Converter={StaticResource formatter}}" Value="positive">
                        <DataTrigger.EnterActions>
                            <StopStoryboard BeginStoryboardName="pos"></StopStoryboard>
                            <BeginStoryboard x:Name="pos">
                                <Storyboard>
                                    <ColorAnimation  AutoReverse="True" To="Green" Duration="0:0:0:0.100" Storyboard.TargetProperty="(TextBox.Background).(SolidColorBrush.Color)"></ColorAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </DataTrigger.EnterActions>
                        <DataTrigger.ExitActions>
                            <RemoveStoryboard BeginStoryboardName="pos"></RemoveStoryboard>
                        </DataTrigger.ExitActions>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

価格は 1 秒あたり数回変更される可能性があるため、新しい価格値が設定されたときに実行中のアニメーションを中止する必要があります。

4

2 に答える 2

1

ストーリーボードは、単純な色の変更にはやり過ぎのようです。背景色をバインドし、価格の IValueConverter を作成します。これは、Price の NotificationChanges に従っているだけです。

IValueConverter を使用して Price の Background 要素にバインドし、そこで色付けロジックを分離することをお勧めします...

Xaml

<TextBlock x:Name="ChangeField" 
           Text="{Binding price}" 
           Background="{Binding price, Converter={StaticResource PriceToColorConverter}}" />

コード

[ValueConversion(typeof(decimal), typeof(Brush))]
public class PriceToColorConverter : IValueConverer
{
   public object Convert(object value, Type target)
   {
      decimal price;
      decimal.Parse(value.ToString(), price);
      return (price > 0 ? Brushes.Green : Brushes.Red);
   }
}
于 2013-11-01T17:43:18.403 に答える
1

これがあなたが探しているものだと思います。テストしましたが、背景色が一瞬変わります。基本的に、小さなエラーが 1 つあります。期間は hh:mm:ss.fff であるはずですが、hh:mm:ss:??.fff を設定しました。

<TextBox HorizontalAlignment="Left" Height="23" Margin="10,178,0,0" TextWrapping="Wrap" Text="{Binding price}" VerticalAlignment="Top" Width="120" x:Name="ChangeField">
    <TextBox.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding  price, Converter={StaticResource formatter}}" Value="positive">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation  AutoReverse="True" To="Green" Duration="0:0:0.100"  
                                                Storyboard.TargetProperty="(TextBox.Background).(SolidColorBrush.Color)"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
于 2013-11-23T07:44:35.120 に答える