如何在标签值发生变化时为背景颜色添加动画
我试图在绑定的值发生更改时获取标签以更改背景颜色。如果它上升,则暂时闪烁绿色。如果发生故障,请暂时闪烁红色。如何在标签值发生变化时为背景颜色添加动画
当我启动应用程序,我得到了这些问题:
- 大多数的标签动画的颜色的时候一小撮,然后就停止,有时不要再改变
- 标签上的时间刚刚转会到红色或绿色,留卡上,不管输入的值
- 如果竞标下降,价差将增大,但所有3个标签动画相同颜色(如果动画作品)
任何人都可以看到这有什么问题,也请评论一个更好的方式来构造这个?我想知道是否有更好的方法来确定价值是否已经上涨或下跌,而不需要ViewModel上的6个属性进行出价,询问和传播?我也想知道是否值得经常改变数值(比如每秒5+)?
谢谢。
查看
<Window x:Class="TestApp.UI.View.QuoteView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="QuoteView" Height="300" Width="300">
<Window.Resources>
<Style x:Key="BidStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=BidHigher}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Green" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=BidLower}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=AskHigher}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Green" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=AskLower}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=SpreadHigher}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Green" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Path=SpreadLower}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Label Content="Bid" HorizontalAlignment="Left" Margin="21,10,0,0" VerticalAlignment="Top" />
<Label Content="Ask" HorizontalAlignment="Left" Margin="19,53,0,0" VerticalAlignment="Top"/>
<Label Content="Spread" HorizontalAlignment="Left" Margin="19,99,0,0" VerticalAlignment="Top"/>
<Label x:Name="BidLabel" HorizontalAlignment="Left" Margin="102,10,0,0" VerticalAlignment="Top" Content="{Binding Path=Quote.Bid}" Style="{StaticResource ResourceKey=BidStyle}"/>
<Label x:Name="AskLabel" HorizontalAlignment="Left" Margin="102,53,0,0" VerticalAlignment="Top" Content="{Binding Path=Quote.Ask}" Style="{StaticResource ResourceKey=BidStyle}"/>
<Label x:Name="SpreadLabel" HorizontalAlignment="Left" Margin="102,99,0,0" VerticalAlignment="Top" Content="{Binding Path=Quote.BidAskSpread}" Style="{StaticResource ResourceKey=BidStyle}"/>
</Grid>
</Window>
视图模型
public class QuoteViewModel : ViewModelBase {
private readonly FakeDataGenerator _dataGenerator;
private Quote _quote;
private bool _bidHigher;
private bool _bidLower;
private bool _askHigher;
private bool _askLower;
private bool _spreadHigher;
private bool _spreadLower;
public QuoteViewModel()
{
_dataGenerator = new FakeDataGenerator();
_dataGenerator.NewQuoteEvent += DataGeneratorOnNewQuoteEvent;
}
private void DataGeneratorOnNewQuoteEvent(Quote quote)
{
Quote = quote;
}
public Quote Quote
{
get { return _quote; }
set
{
if (_quote != value)
{
UpdateQuoteComparisons(_quote, value);
_quote = value;
OnPropertyChanged("Quote");
}
}
}
private void UpdateQuoteComparisons(Quote existingQuote, Quote newQuote)
{
if(existingQuote == null)
{
return;
}
if (newQuote.Bid > existingQuote.Bid)
{
BidHigher = true;
}
else if (newQuote.Bid < existingQuote.Bid)
{
BidLower = true;
}
if (newQuote.Ask > existingQuote.Ask)
{
AskHigher = true;
}
else if (newQuote.Ask < existingQuote.Ask)
{
AskLower = true;
}
if (newQuote.BidAskSpread > existingQuote.BidAskSpread)
{
SpreadHigher = true;
}
else if (newQuote.BidAskSpread < existingQuote.BidAskSpread)
{
SpreadLower = true;
}
}
public bool BidHigher
{
get { return _bidHigher; }
set
{
_bidHigher = value;
OnPropertyChanged("BidHigher");
}
}
public bool BidLower
{
get { return _bidLower; }
set
{
_bidLower = value;
OnPropertyChanged("BidLower");
}
}
public bool AskHigher
{
get { return _askHigher; }
set
{
_askHigher = value;
OnPropertyChanged("AskHigher");
}
}
public bool AskLower
{
get { return _askLower; }
set
{
_askLower = value;
OnPropertyChanged("AskLower");
}
}
public bool SpreadHigher
{
get { return _spreadHigher; }
set
{
_spreadHigher = value;
OnPropertyChanged("SpreadHigher");
}
}
public bool SpreadLower
{
get { return _spreadLower; }
set
{
_spreadLower = value;
OnPropertyChanged("SpreadLower");
}
}
}
回答:
你可以尝试通过DataTrigger.ExitActions停止故事板(你必须说出你现有BeginStoryboard的):
<DataTrigger Binding="{Binding Path=SpreadLower}" Value="True"> <DataTrigger.EnterActions>
<BeginStoryboard Name="SpreadLowerStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.2" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="SpreadLowerStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
以上是 如何在标签值发生变化时为背景颜色添加动画 的全部内容, 来源链接: utcz.com/qa/266207.html