Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何在标签值更改时设置背景颜色的动画_Wpf_Animation_Mvvm_Styles_Datatrigger - Fatal编程技术网

Wpf 如何在标签值更改时设置背景颜色的动画

Wpf 如何在标签值更改时设置背景颜色的动画,wpf,animation,mvvm,styles,datatrigger,Wpf,Animation,Mvvm,Styles,Datatrigger,我试图让一个标签在其绑定的值改变时改变背景颜色。如果上升,则暂时呈绿色闪烁。如果下降,则暂时闪烁红色 当我启动应用程序时,我会遇到以下问题: 大多数情况下,标签会对颜色进行少量动画处理,然后停止,不再更改 有时,不管输入值是多少,标签都会移动到红色或绿色,并保持不变 如果出价下降,价差将增加,但所有3个标签的动画颜色相同(如果动画有效) 有人能看到这有什么问题吗?请同时评论一个更好的方法来构建这个?我想知道是否有更好的方法来确定价值是上升还是下降,而不需要ViewModel上的6个属性进行出

我试图让一个标签在其绑定的值改变时改变背景颜色。如果上升,则暂时呈绿色闪烁。如果下降,则暂时闪烁红色

当我启动应用程序时,我会遇到以下问题:

  • 大多数情况下,标签会对颜色进行少量动画处理,然后停止,不再更改
  • 有时,不管输入值是多少,标签都会移动到红色或绿色,并保持不变
  • 如果出价下降,价差将增加,但所有3个标签的动画颜色相同(如果动画有效)
有人能看到这有什么问题吗?请同时评论一个更好的方法来构建这个?我想知道是否有更好的方法来确定价值是上升还是下降,而不需要ViewModel上的6个属性进行出价、询问和分摊?我还想知道这是否取决于非常频繁的值更改(比如每秒5+次)

谢谢


看法



视图模型

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");
        }
    }
}
public类QuoteViewModel:ViewModelBase
{
私有只读FakeDataGenerator\u dataGenerator;
私人报价;
私人布尔比德更高;
私人布尔(bidLower),;
二等兵布尔·阿斯克希尔;
私人住宅;
私人布尔(bool)更高;;
私人住宅;
公共QuoteViewModel()
{
_dataGenerator=新的FakeDataGenerator();
_dataGenerator.NewQuoteEvent+=DataGeneratorOnNewQuoteEvent;
}
专用void数据生成器onnewquoteEvent(报价)
{
报价=报价;
}
公开报价
{
获取{return}
设置
{
如果(_quote!=值)
{
UPDATEQUOTE比较(_quote,value);
_报价=价值;
不动产变更(“报价”);
}
}
}
私有void updatequote比较(Quote existingQuote、Quote newQuote)
{
if(existingQuote==null)
{
返回;
}
如果(newQuote.Bid>existingQuote.Bid)
{
更高=真;
}
否则如果(newQuote.BidexistingQuote.Ask)
{
AskHigher=真;
}
else if(newQuote.AskexistingQuote.BidAskSpread)
{
更高=真;
}
else if(newQuote.BidAskSpread
您可以尝试通过DataTrigger.ExitActions停止情节提要(您必须命名现有的BeginStoryboard):


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 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>