C# 值更改时设置文本框背景动画

C# 值更改时设置文本框背景动画,c#,wpf,datatrigger,coloranimation,wpf-animation,C#,Wpf,Datatrigger,Coloranimation,Wpf Animation,我想根据ViewModel中的新值设置textbox(Price)背景颜色的动画 颜色可以根据新值的不同而不同(大0->绿色-小0->红色) 我能看到的唯一动画是在启动时设置新值。此后,动画将不再出现 <TextBox HorizontalAlignment="Left" Height="23" Margin="10,178,0,0" TextWrapping="Wrap" Text="{Binding price}" VerticalAlignment="Top" Width="120"

我想根据ViewModel中的新值设置textbox(Price)背景颜色的动画

颜色可以根据新值的不同而不同(大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>


价格可能每秒改变几次,因此当设置了新的价格值时,我需要中止正在运行的动画。

对于一个简单的颜色改变来说,故事板似乎有点过分了。我将绑定背景色,并为价格创建一个IValueConverter,它只是跟随价格的通知更改

我建议使用IValueConverter绑定到Price的背景元素,并隔离那里的着色逻辑

Xaml
我想这就是你要找的。我已经测试过了,背景颜色会在瞬间改变。基本上您有一个小错误:Duration应该是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>


好的,现在我知道出了什么问题。当我运行到“肯定”状态,并且之后所有来自转换器的更新也带有“肯定”时,DataTrigger从不进入“EnterActions”。现在我需要知道如何重置DataTriggerHi的值,对不起,我忘了告诉你我需要一个“flash”动画。所以当价格上涨时,我想把颜色变成绿色。1秒后,颜色必须恢复为默认颜色。根据我对WPF的理解,我需要一个触发器来启动这些动画。
[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);
   }
}
<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>