2011-01-05 11 views
2

Ich habe ein Rechteck, mit dem ich die Hintergrundfarbe animiere.WPF Animation mit Datentriggern

Sie sollte jedes Mal grün werden, wenn eine bestimmte Zahl höher wird. Und rot, wenn es geht. Wenn sich die Zahl für eine Weile nicht ändert, wird sie langsam wieder auf die Standardfarbe zurückgesetzt

So wechselt die Animation sehr schnell den Hintergrund von grau nach rot und dauert dann einige Sekunden, um wieder grau zu werden.

Ich habe als Datatrigger hinzugefügt, die auf 1 oder gebunden ist, -1, je nachdem wie die Zahl

Das Problem geändert hat, ist, dass, wenn die Zahl hält sich die Animation steigt nicht neu gestartet bekommen.

z.B. wenn die Reihenfolge der Nummern 1 geht, 2, 3, 4, 5. Dann würde ich die Animation wie bei jeder Nummer Änderung neu zu starten

der Code verwende ich unter

<Rectangle.Style> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding BidChangeDirectionIndicator}" 
         Value="-1"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard x:Name="bidDownStory"> 
         <Storyboard> 
          <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)"> 
           <EasingColorKeyFrame KeyTime="0" 
                Value="#FF79797A" /> 
           <EasingColorKeyFrame KeyTime="0:0:0.2" 
                Value="#FFF13B29" /> 
           <EasingColorKeyFrame KeyTime="0:0:10.0" 
                Value="#FF79797A" /> 
          </ColorAnimationUsingKeyFrames> 
          <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)"> 
           <EasingColorKeyFrame KeyTime="0" 
                Value="#FF2B2B2B" /> 
           <EasingColorKeyFrame KeyTime="0:0:0.2" 
                Value="#FF3F0606" /> 
           <EasingColorKeyFrame KeyTime="0:0:10.0" 
                Value="#FF2B2B2B" /> 
          </ColorAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <StopStoryboard BeginStoryboardName="bidDownStory" /> 
       </DataTrigger.ExitActions> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

und das Viewmodel I Die Zahl ändert sich jedes Mal, wird wie dieses

private int _bidChangeDirectionIndicator; 
public int BidChangeDirectionIndicator 
{ 
    get { return _bidChangeDirectionIndicator; } 
    set 
    { 
     _bidChangeDirectionIndicator = value; 
     RaisePropertyChanged("BidChangeDirectionIndicator"); 
    } 
} 

.... 

public void Update(RateInfo rateInfo) 
{ 
    if (rateInfo.Bid != Bid) 
    { 
     BidChangeDirectionIndicator = Math.Sign(rateInfo.Bid - Bid); 
    }    
} 

Die Methode sieht mich verbindlich genannt (dies wird durch eine Klasse durchgeführt, die an einen externen Feed hört)

+0

Es ist schwierig, das neu zu erstellen. Kannst du auch deinen Klassencode posten? Und hast du von Anfang an versucht, 'FillBehavior =" Stop "auf diese Animationen zu setzen? – decyclone

+0

hi - Ich habe die wichtigen Bits oben hinzugefügt. Ich denke, Sie könnten dies mit einer Klasse replizieren, die alle paar Sekunden in einer Schleife aktualisiert. – ChrisCa

+0

Auch - FillBehaviour = "Stop" hat leider nicht funktioniert – ChrisCa

Antwort

0

[Caveat: ich habe nicht hatte Zeit, dies neu zu erstellen und zu testen. Ich dachte nur, es könnte helfen.]

Der Grund, dass der Auslöser nicht ausgelöst wird, ist, dass der Wert sich nicht ändert. Wenn Sie zum Beispiel weiter steigen, bleibt der Wert von BidChangeDirectionIndicator 1.

Vielleicht ist die einfachste Sache zu tun, um es auf einen anderen Wert (0) und dann auf den gewünschten Wert zu setzen.

public void Update(RateInfo rateInfo) 
{ 
    if (rateInfo.Bid != Bid) 
    { 
     BidChangeDirectionIndicator = Math.Sign(rateInfo.Bid - Bid); 
    }    
    else 
    { 
     BidChangeDirectionIndicator = 0; 
     BidChangeDirectionIndicator = rateInfo.Bid; 
    } 
}