如何在标签值发生变化时为背景颜色添加动画

我试图在绑定的值发生更改时获取标签以更改背景颜色。如果它上升,则暂时闪烁绿色。如果发生故障,请暂时闪烁红色。如何在标签值发生变化时为背景颜色添加动画

当我启动应用程序,我得到了这些问题:

  • 大多数的标签动画的颜色的时候一小撮,然后就停止,有时不要再改变
  • 标签上的时间刚刚转会到红色或绿色,留卡上,不管输入的值
  • 如果竞标下降,价差将增大,但所有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

回到顶部