2009-09-03 7 views
0

J'ai un ViewModel avec une propriété State et un Datatemplate qui contient un simple rectangle avec un pinceau de fond. Chaque fois que l'état du ViewModel change, je veux déclencher une animation qui commence par la couleur que le pinceau a actuellement et l'anime à la nouvelle couleur représentant le nouvel état. Je l'ai fait avec des datatriggers. Et ça marche presque. Le seul problème que j'ai est qu'il ne commence pas avec la couleur que le pinceau a actuellement, mais avec la couleur de base unanime. C'est probablement parce que je supprime l'animation dans l'action de sortie. Mais si je ne fais pas cela, je ne peux animer qu'une seule fois. Qu'est-ce que je rate?Changer l'animation en fonction de la valeur de la propriété

Une autre question que j'ai est: J'ai besoin de cette stateanimation dans beaucoup de différents types de données, il se lie toujours à la même propriété ("State") et ils animent toujours un SolidColorbrush. Existe-t-il un moyen de partager ces animations de Datatrigger sur des datatemplates utilisant des ressources et/ou des styles?

<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=State}" Value="Active"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard x:Name="activeStoryboard" HandoffBehavior="SnapshotAndReplace"> 
       <Storyboard> 
        <ColorAnimation To="Green" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
     <DataTrigger.ExitActions> 
      <RemoveStoryboard BeginStoryboardName="activeStoryboard" /> 
     </DataTrigger.ExitActions> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=State}" Value="Error"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard x:Name="errorStoryboard" HandoffBehavior="SnapshotAndReplace"> 
       <Storyboard> 
        <ColorAnimation To="Red" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
     <DataTrigger.ExitActions> 
      <RemoveStoryboard BeginStoryboardName="errorStoryboard" /> 
     </DataTrigger.ExitActions> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=State}" Value="Wait"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard x:Name="waitStoryboard" HandoffBehavior="SnapshotAndReplace"> 
       <Storyboard> 
        <ColorAnimation To="Yellow" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
     <DataTrigger.ExitActions> 
      <RemoveStoryboard BeginStoryboardName="waitStoryboard" /> 
     </DataTrigger.ExitActions> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Path=State}" Value="Inactive"> 
     <DataTrigger.EnterActions> 
      <BeginStoryboard x:Name="inactiveStoryboard" HandoffBehavior="SnapshotAndReplace"> 
       <Storyboard> 
        <ColorAnimation To="Gray" FillBehavior="HoldEnd" Duration="00:00:0.25" Storyboard.TargetName="stateBrush" Storyboard.TargetProperty="Color" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </DataTrigger.EnterActions> 
     <DataTrigger.ExitActions> 
      <RemoveStoryboard BeginStoryboardName="inactiveStoryboard" /> 
     </DataTrigger.ExitActions> 
    </DataTrigger> 
</DataTemplate.Triggers> 

Répondre

0

Je ne peux pas répondre complètement à votre question, mais je peux au moins dire que vous pouvez partager les story-boards mais je ne suis pas sûr au sujet des DataTriggers eux-mêmes. Une idée intéressante cependant. Je me suis posé la même question à propos de Bindings car j'ai souvent plusieurs utilisations répétées d'une seule liaison et essayais de trouver un moyen de la déclarer une fois et de la réutiliser au moins dans un seul Control ou XAML ResourceDictionary.

Questions connexes