2012-08-14 6 views
3

J'ai une petite ellipse que je veux faire clignoter chaque fois qu'une propriété de dépendance est définie sur true. Parce que la propriété peut très rapidement passer de true à false en quelques millisecondes, je dois le faire avec une animation et non un simple datatrigger. Fondamentalement, je veux juste que la vraie valeur ping une animation sur l'ellipse.L'animation WPF ne déclenche qu'une seule fois

<Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0"> 
    <Ellipse.Fill> 
     <SolidColorBrush /> 
    </Ellipse.Fill> 
    <Ellipse.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsReceiving}" Value="True" > 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color"> 
            <ColorAnimationUsingKeyFrames.KeyFrames> 
             <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/> 
             <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/> 
            </ColorAnimationUsingKeyFrames.KeyFrames> 
           </ColorAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Ellipse.Style> 
</Ellipse> 

Cette animation semble fonctionner, mais il ne se déclenche la première fois que la valeur atteint vrai. Est-ce que je manque quelque chose?

MISE À JOUR: Merci pour l'entrée tout le monde. Il s'est avéré que c'était un problème de threading. À l'origine, j'avais un DP sur le contrôle qui était lié à un modèle de vue qui implémentait INotifyPropertyChanged. J'ai alors essayé d'enlever le DP sur le contrôle et de transformer ma propriété de modèle de vue en DP. Boom, c'est à ce moment que j'ai commencé à recevoir une erreur indiquant qu'un thread différent possédait l'objet. Je me suis rendu compte que j'avais besoin d'intégrer des observables en utilisant des extensions réactives comme je l'avais fait dans d'autres parties de l'application. Je suis revenu à la propriété traditionnelle du modèle de vue avec PropertyChanged() et je l'ai simplement lié à l'animation du contrôle. Tout fonctionne parfaitement maintenant.

Répondre

0

Vous devez fournir la définition de la propriété IsReceiving pour être sûr. Basé sur l'hypothèse que vous avez une propriété (IsReceiving) qui permute entre True et False qui déclenchera cet effet d'animation: Si vous ne voyez que l'effet déclenché une fois alors:

1) Vérifiez que la propriété est soit un DependencyProperty ou en utilisant INotifyPropertyChanged correctement pour signaler les mises à jour à la vue.
2) Vérifiez que le paramètre de propriété passe réellement de Vrai à Faux et inversement.

1
<Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0"> 
     <Ellipse.Fill> 
      <SolidColorBrush /> 
     </Ellipse.Fill> 
     <Ellipse.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsReceiving,Mode=TwoWay}" Value="True" > 
         <DataTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color"> 
             <ColorAnimationUsingKeyFrames.KeyFrames> 
              <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/> 
              <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/> 
             </ColorAnimationUsingKeyFrames.KeyFrames> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </DataTrigger.EnterActions> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Ellipse.Style> 
    </Ellipse> 

Essayez d'utiliser le mode = TwoWay

+2

Pourquoi voudriez-vous lier TwoWay il? – franssu

0

Je ne peux pas reproduire votre problème. Voici mon behind:

public partial class MainWindow : Window 
{ 
    public static readonly DependencyProperty IsReceivingProperty = 
     DependencyProperty.Register("IsReceiving", 
            typeof(bool), typeof(MainWindow)); 

    public bool IsReceiving 
    { 
     get { return (bool)GetValue(IsReceivingProperty); } 
     set { SetValue(IsReceivingProperty, value); } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     myEllipse.DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.IsReceiving = true; 
     this.IsReceiving = false; 
    } 
} 
3

J'ai eu un problème similaire où j'avais « in » et « out » animation pour être un DP déclenché lorsqu'un changement. Le premier cycle a bien fonctionné, mais après cela, rien ne s'est passé. Je l'ai résolu en ajoutant RemoveStoryboard EnterActions avant les actions BeginStoryboard.

<Border Name="Zyzzyx" Grid.Row="1" Background="DarkRed" Height="0" VerticalAlignment="Bottom"> 
    <Border.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=SelectionState, ElementName=ControlRoot, Mode=OneWay}" Value="Selecting"> 
        <DataTrigger.EnterActions> 
         <RemoveStoryboard BeginStoryboardName="AnimateIn" /> 
         <RemoveStoryboard BeginStoryboardName="AnimateOut" /> 
         <BeginStoryboard Name="AnimateIn" HandoffBehavior="SnapshotAndReplace"> 
          <Storyboard FillBehavior="HoldEnd" Duration="0:0:5"> 
           <DoubleAnimation To="30" Duration="0:0:5" Storyboard.TargetProperty="Height" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=SelectionState, ElementName=ControlRoot, Mode=OneWay}" Value="Deselecting"> 
        <DataTrigger.EnterActions> 
         <RemoveStoryboard BeginStoryboardName="AnimateIn" /> 
         <RemoveStoryboard BeginStoryboardName="AnimateOut" /> 
         <BeginStoryboard Name="AnimateOut" HandoffBehavior="SnapshotAndReplace"> 
          <Storyboard FillBehavior="HoldEnd" Duration="0:0:5"> 
           <DoubleAnimation To="0" Duration="0:0:5" Storyboard.TargetProperty="Height" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 

<!-- Border content --> 

</Border> 
+0

Bizarre. Y a-t-il une explication derrière tout cela? – MrZander

1

J'ai vu aussi un problème similaire pour résoudre mon problème je l'ai trouvé que je devais ajouter une balise StopStoryboard dans les ExitActions du DataTrigger.

1
   <DataTrigger.EnterActions> 
        <RemoveStoryboard BeginStoryboardName="AnimateIn" /> 
        <RemoveStoryboard BeginStoryboardName="AnimateOut" /> 
        <BeginStoryboard ...> 
       </DataTrigger.EnterActions> 

œuvres, mais je pense qu'il est préférable d'utiliser

   <DataTrigger.EnterActions> 
        <BeginStoryboard Name="FadeIn"...> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <RemoveStoryboard BeginStoryboardName="FadeIn" /> 
       </DataTrigger.ExitActions> 
Questions connexes