2012-03-17 6 views
3

Eh bien, je suis en train de changer la couleur de fond d'un StackPanel dans un DataTemplate en utilisant ColorAnimation:Changement StackPanel couleur de fond avec ColorAnimation

<DataTemplate DataType="{x:Type logic:Sensor}"> 
     <StackPanel Name="SensorPanel" MouseDown="SensorPanel_MouseDown"> 
     </StackPanel> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Status}" Value="0"> 
       <!--<Setter TargetName="SensorPanel" Property="Background" Value="LawnGreen" />--> 

       <DataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation 
           Storyboard.TargetName="SensorPanel" 
           Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" 
           To="LawnGreen" Duration="0:0:0.25" AutoReverse="True" RepeatBehavior="4"> 
          </ColorAnimation> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 

      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

Aucune erreur de compilation. Mais quand j'exécute cela une InvalidOperationException est levée: "La propriété 'Background' ne pointe pas vers un DependencyObject dans le chemin '(0). (1)'."

Quoi? : D

+0

[link] (http://stackoverflow.com/questions/17399210/background-property-does-not-point-to-a-dependencyobject-in-path-0-1) Vous pouvez voir ce lien comme similaire à votre problème. –

Répondre

17

Votre code a parfaitement fonctionné pour moi. Je viens de faire des modifications mineures.

<DataTemplate DataType="{x:Type Model:Sensor}"> 
     <StackPanel Name="SensorPanel" Background="LightBlue" Width="100" Margin="5"> 
      <TextBlock Text="{Binding Name}"/> 
      <ToggleButton Margin="2" IsChecked="{Binding IsChecked}" Content="Set status=0" /> 
     </StackPanel> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Status}" Value="0"> 
       <!--<Setter TargetName="SensorPanel" Property="Background" Value="LawnGreen" />--> 

       <DataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation 
          Storyboard.TargetName="SensorPanel" 
          Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" 
          To="LawnGreen" Duration="0:0:0.25" AutoReverse="True" RepeatBehavior="4"> 
          </ColorAnimation> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 

      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

    <ListBox ItemsSource="{Binding Sensors}" /> 
+0

Merci, mais est-ce censé répéter pour toujours? parce que c'est le cas. :( – liranxs

+4

RepeatBehaviour = "4x" va le réparer.Spécifier un nombre est interprété comme un TimeSpan, donc ce que vous avez signifie '04: 00: 00 'ou' pendant 4 heures ' – Phil

10

Pour la documentation:

Il est un peu difficile à utiliser (Panel.Background).(SolidColorBrush.Color). Le vrai problème est que ColorAnimation ne fonctionne que pour la propriété Color, au lieu de Brush. Pour moi, c'est le truc:

Définissez votre brosse panneau ...

<StackPanel Name="SensorPanel" MouseDown="SensorPanel_MouseDown"> 
    <StackPanel.Background> 
     <SolidColorBrush Color="White" x:Name="PanelColor"/> 
    </StackPanel.Background> 
</StackPanel> 

... puis animer la propriété Color de la place SolidColorBrush:

<ColorAnimation 
    Storyboard.TargetName="PanelColor" 
    Storyboard.TargetProperty="Color" 
    To="LawnGreen" Duration="0:0:0.25" AutoReverse="True" RepeatBehavior="4"> 
+0

Devrait être la réponse acceptée. –