Wie kombinieren DataTrigger und EventTrigger?
HINWEIS habe ich gefragt, die damit verbundene Frage (mit einer akzeptierten Antwort): Wie kombinieren DataTrigger und Trigger?
Ich glaube, ich brauche zu kombinieren EventTrigger
und ein DataTrigger
zu erreichen, was ich mir nach:
- wenn ein Element in meine ListBox, es sollte flash für ein paar Momente
- wenn das Element 'Kritische', dann bleiben sollte hervorgehoben
Derzeit habe ich ein DataTemplate, das wie folgt aussieht:
<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}">
<Grid HorizontalAlignment="Stretch">
<Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<Border Name="Highlight" CornerRadius="8" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<!-- snip actual visual stuff -->
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation x:Name="LoadedAnimation"
Storyboard.TargetName="Highlight"
Storyboard.TargetProperty="Opacity"
From="0" To="1"
RepeatBehavior="5x"
Duration="0:00:0.2"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsCritical}" Value="True">
<Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Die Idee ist, dass ein EventTrigger animiert die Highlight
Grenze der Deckkraft zwischen 0 und 1 und wieder zurück wiederholt, wenn das Element zum ersten mal geladen wird, zeichnen die Aufmerksamkeit des Benutzers zu. Die DataTrigger
bestimmt die Anzahl von malen zu animieren. Wenn ein view-Modell berichten, dass die Sache IsCritical
dann die animation erfolgt 5,5 mal (so dass es endet am opacity 1), sonst tritt 5-mal (endend bei Deckkraft 0.)
Jedoch die oben XAML funktioniert nicht, da die DataTrigger der setter schlägt fehl mit:
Kind mit dem Namen 'LoadedAnimation' nicht gefunden im VisualTree.
Fair genug. Also, scheuen mithilfe einer benutzerdefinierten Wert Konverter oder setzen Sie die animation zählen Sie auf die Ansicht Modell und die Bindung zu ihm, was sind meine Optionen?
- Es könnte hilfreich sein, stackoverflow.com/questions/2764415/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde ein Verhalten instead of-Trigger in diesem Fall. Sie können schreiben, ein Verhalten, das legt einen Ereignishandler für das zugeordnete Objekt-load-Ereignis und setzt dann die animation. Das Verhalten kann setzen einige Eigenschaften, ich würde setzen eine AnimationCount (int) die Eigenschaft, der sagt, die Verhalten, wie oft die animation wiederholt werden soll auf das element, das mit Ihr verbunden ist. Sie können dann binden Sie diese Eigenschaft, um die IsCritical-Eigenschaft in der Ansicht-Modell verwenden und einen Wert converter konvertiert false zu 5 und treu 5.5
Hoffe, das hilft
Wenn Sie Zugriff auf die Blend SDK (Sie sollten, wenn Sie mit VS2012+), sollten Sie in der Lage sein, dies zu erreichen, vollständig in XAML, mit so etwas wie dies (disclaimer: nicht getestet):
Extrahieren Sie das Storyboard ein VisualState, dann mit dem expression-Bibliothek switch-Staaten innerhalb der XAML-Code. Sie benötigen Microsoft.Ausdruck.Wechselwirkungen Bibliothek, siehe auch WPF - /Silverlight-Staaten - Aktivieren von XAML?
Ich weiß, Sie sagten, Sie waren nicht scharf auf die Idee, einen Konverter, aber es sieht aus wie die Mischung-Lösungen erfordern eine Bibliothek installiert sein. Der Konverter ist nicht viel Arbeit und signalisiert die Absicht, dass die rate ist direkt abhängig von der
IsCritical
Eigenschaft:Und dann aktualisieren Sie Ihre animation:
Den
DataTrigger
können dann entfernt werden.Probieren Sie etwas wie dieses: