2011-02-09 12 views
5

मेरे पास एक बहुत ही सरल wpftoolkit है: डेटाग्रिड शेयर बाजार बोली दिखाने और पूछने के लिए।बाध्य संपत्ति के मूल्य को बदलते समय टेक्स्टब्लॉक की पृष्ठभूमि को एनिमेट कैसे करें?

मेरा ग्रिड ObservableCollection<PriceViewModel> से जुड़ा हुआ है। मेरा PriceViewModel लागू INotifyPropertyChanged

ग्रिड सही ढंग से अद्यतन करता है और मैंने पृष्ठभूमि रंग को एनिमेट करने में कामयाब रहा है लेकिन यह एनीमेशन लागू करने में अड़चन है।

नीचे मॉडल मॉडल वर्ग का एक्सएएमएल और स्निपेट है।

विचार केवल लाल रंग का है जब कीमत अपडेट पिछले और हरे रंग की तुलना में कम है ... यह बहुत ही फैंसी नहीं है।

 <WpfToolkit:DataGrid Name="PriceDataGrid" RowHeaderWidth="5" 
AutoGenerateColumns="False" VerticalContentAlignment="Center" Margin="0,33,0,0" HorizontalAlignment="Left" Width="868"> 
     <WpfToolkit:DataGrid.Columns> 
      <WpfToolkit:DataGridTemplateColumn Header="Bid" MinWidth="40"> 
       <WpfToolkit:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Bid}" Margin="3,1" x:Name="txtTextBlock"> 
          <TextBlock.Background> 
           <SolidColorBrush Color="Transparent"></SolidColorBrush> 
          </TextBlock.Background> 
         </TextBlock> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding BidUp}" Value="True"> 
           <DataTrigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation 
               BeginTime="00:00:00" 
               Duration="0:0:0.1" 
               To="Green" 
               AutoReverse="True" 
               Storyboard.TargetName="txtTextBlock" 
               Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"> 
              </ColorAnimation> 
             </Storyboard> 
            </BeginStoryboard> 
           </DataTrigger.EnterActions> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding BidDown}" Value="True"> 
           <DataTrigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation 
               BeginTime="00:00:00" 
               Duration="0:0:0.1" 
               To="Red" 
               AutoReverse="True" 
               Storyboard.TargetName="txtTextBlock" 
               Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"> 
              </ColorAnimation> 
             </Storyboard> 
            </BeginStoryboard> 
           </DataTrigger.EnterActions> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </WpfToolkit:DataGridTemplateColumn.CellTemplate> 
      </WpfToolkit:DataGridTemplateColumn> 
      <WpfToolkit:DataGridTextColumn Header="Ask" Binding="{Binding Path=Ask}" MinWidth="40" /> 
     </WpfToolkit:DataGrid.Columns> 
    </WpfToolkit:DataGrid> 

और दृश्य मॉडल:

public class PriceViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    Price _price; 

    private bool _bidUp = false; 
    private bool _bidDown = false; 


    public bool BidUp 
    { 
     get 
     { 
      return _bidUp; 
     } 

     set 
     { 
      _bidUp = value; 
      OnPropertyChanged("BidUp"); 
     } 
    } 
    public bool BidDown 
    { 
     get 
     { 
      return _bidDown; 
     } 

     set 
     { 
      _bidDown = value; 
      OnPropertyChanged("BidDown"); 
     } 
    } 

    public double Bid 
    { 
     get { return _price.Bid; } 
     set 
     { 
      BidUp = (value > _price.Bid); 
      BidDown = (value < _price.Bid); 

      _price.Bid = value; 
      OnPropertyChanged("Bid"); 
     } 
    } 

    public double Ask 
    { 
     get { return _price.Ask; } 
     set 
     { 
      AskUp = (value > _price.Ask); 
      _price.Ask = value; 
      OnPropertyChanged("Ask"); 
     } 
    } 


    public PriceViewModel(Price price) 
    { 
     _price = price; 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 

उत्तर

9

मैं इस कोशिश की और यह अगर तुम Storyboard रों रोक इससे पहले कि आप नया शुरू बेहतर काम करने लगता है। एक Storyboard रोकने के लिए, इसे नाम और फोन

<StopStoryboard BeginStoryboardName="bidUpStoryboard"/> 

इस

<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding BidUp}" Value="True"> 
     <DataTrigger.EnterActions> 
      <StopStoryboard BeginStoryboardName="bidUpStoryboard"/> 
      <StopStoryboard BeginStoryboardName="bidDownStoryboard"/> 
      <BeginStoryboard Name="bidUpStoryboard"> 
       <Storyboard BeginTime="00:00:00"> 
        <ColorAnimation 
         BeginTime="00:00:00" 
         Duration="0:0:0.1" 
         To="Green" 
         AutoReverse="True" 
         Storyboard.TargetName="txtTextBlock" 
         Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"> 
        </ColorAnimation> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding BidDown}" Value="True"> 
     <DataTrigger.EnterActions> 
      <StopStoryboard BeginStoryboardName="bidUpStoryboard"/> 
      <StopStoryboard BeginStoryboardName="bidDownStoryboard"/> 
      <BeginStoryboard Name="bidDownStoryboard"> 
       <Storyboard BeginTime="00:00:00"> 
        <ColorAnimation 
         BeginTime="00:00:00" 
         Duration="0:0:0.1" 
         To="Red" 
         AutoReverse="True" 
         Storyboard.TargetName="txtTextBlock" 
         Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"> 
        </ColorAnimation> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
    </DataTrigger> 
</DataTemplate.Triggers> 

भी है जैसे कि यह प्रयास करें, BidUp एक पंक्ति में सही दो बार करने के लिए सेट है, तो यह बाद से दूसरी बार ट्रिगर नहीं करेगा यह सच से सच हो जाएगा, इसलिए यदि आप प्रत्येक बार एक मूल्य परिवर्तन में चमकती प्रभाव दिखाना चाहते हैं तो आपको इसे किसी बिंदु पर गलत पर सेट करना होगा। जैसे बोली और askbackgrounds से प्रत्येक के लिए एक -

public double Bid 
{ 
    get { return _price.Bid; } 
    set 
    { 
     BidUp = false; 
     BidDown = false; 
     BidUp = (value > _price.Bid); 
     BidDown = (value < _price.Bid); 
     _price.Bid = value; 
     OnPropertyChanged("Bid"); } 
} 
+0

महान काम किया। कुल मिलाकर मेरा दृष्टिकोण एक ताकत को महसूस करता है, क्या इस तरह के व्यवहार के लिए एक बेहतर पैटर्न है या जिस तरह से मैं अपने ट्रिगर जेनरेट कर सकता हूं? – MattC

+0

क्या हम डेटाग्रिड का उपयोग किए बिना इस विधि को कर सकते हैं? – Alkimake

0

एक वैकल्पिक अपने PriceViewModel पर गुण के एक जोड़े के लिए हो सकता है। उसके बाद आप एक संग्रह प्राप्त कर सकते थे जिसने ObserveableCollection में कौन से आइटम अपडेट किए थे, इसका ट्रैक रखा था। एक टाइमर समय-समय पर इस संग्रह की जांच करेगा, और रीसेट होने के कारण सेल बैक रंग रीसेट करेगा।

एक यहाँ उदाहरण:

http://noelwatson.com/blog/2012/05/01/WPFBlotterflashingCellsWhenUpdated.aspx

संबंधित मुद्दे