Vue d'ensemble des événements de minutage
Cette rubrique décrit comment utiliser les cinq événements de minutage disponibles sur les objets Timeline et Clock.
Composants requis
Pour comprendre cette rubrique, vous devez comprendre comment créer et utiliser des animations. Pour la prise en main des animations, consultez Vue d'ensemble de l'animation.
Il y a plusieurs méthodes pour animer des propriétés dans WPF :
Utilisation d'objets de table de montage séquentiel (balise et code): Vous pouvez utiliser des objets Storyboard pour réorganiser et distribuer des animations à un ou plusieurs objets. Pour obtenir un exemple, consultez Comment : animer une propriété à l'aide d'un storyboard.
Utilisation d'animations locales (code uniquement): Vous pouvez appliquer des objets AnimationTimeline directement aux propriétés qu'ils animent. Pour obtenir un exemple, consultez Comment : animer une propriété sans utiliser de storyboard.
Utilisation d'horloges (code uniquement): Vous pouvez gérer la création d'horloge explicitement et distribuer vous-même les horloges d'animation. Pour obtenir un exemple, consultez Comment : animer une propriété à l'aide d'un AnimationClock.
Du fait que vous pouvez les utiliser dans la balise et le code, les exemples dans cette vue d'ensemble utilisent des objets Storyboard. Toutefois, les concepts décrits peuvent être appliqués aux autres méthodes d'animation des propriétés.
Qu'est-ce qu'une horloge ?
Une chronologie, par elle-même, ne fait réellement rien d'autre que de décrire un segment de temps. C'est l'objet Clock de la chronologie qui fait le vrai travail : il maintient l'état connexe à horloge au moment de l'exécution de la chronologie. Dans la plupart des cas, comme lors de l'utilisation de tables de montage séquentiel, une horloge est créée automatiquement pour votre chronologie. Vous pouvez également créer une Clock de manière explicite à l'aide de la méthode CreateClock. Pour plus d'informations sur les objets Clock, consultez Vue d'ensemble de l'animation et du système de minutage.
Pourquoi utiliser des événements ?
À une exception près (appel aligné sur le dernier battement), les opérations d'horloge interactives sont toutes asynchrones. Vous ne disposez d'aucun moyen de savoir quand elles se produisent exactement. Cela peut poser un problème lorsque vous avez un autre code qui est dépendant de l'opération d'horloge. Supposez que vous souhaitiez arrêter une chronologie qui animait un rectangle. Après avoir arrêté la chronologie, vous modifiez la couleur du rectangle.
myStoryboard.Stop(myRectangle)
' This statement might execute
' before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue
myStoryboard.Stop(myRectangle);
// This statement might execute
// before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue;
Dans l'exemple précédent, la deuxième ligne de code peut s'exécuter avant l'arrêt de la table de montage séquentiel. La raison en est que l'arrêt est une opération asynchrone. Demander à une chronologie ou une horloge de s'arrêter crée un genre de « demande d'arrêt » qui n'est pas traitée avant le prochain battement du moteur de minutage.
Pour exécuter des commandes après avoir complété une chronologie, utilisez les événements de minutage. Dans l'exemple suivant, un gestionnaire d'événements est utilisé pour modifier la couleur d'un rectangle après que la lecture de la table de montage séquentiel s'est arrêtée.
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
Pour un exemple plus complet, consultez Comment : recevoir une notification en cas de changement d'état de l'horloge.
Événements publics
Les classes Timeline et Clock fournissent toutes deux cinq événements de minutage. La table suivante répertorie ces événements et les conditions qui les déclenchent.
Événement |
Opération interactive de déclenchement |
Autres déclencheurs |
---|---|---|
Terminé |
Ignorer pour remplir |
L'horloge se termine. |
CurrentGlobalSpeedInvalidated |
Pause, résumé, appel, définir ratio vitesse, ignorer pour remplir, arrêt |
L'horloge s'inverse, accélère, démarre ou s'arrête. |
CurrentStateInvalidated |
Démarrer, ignorer pour remplir, arrêter |
L'horloge démarre, s'arrête ou remplit. |
CurrentTimeInvalidated |
Démarrer, appeler, ignorer pour remplir, arrêter |
L'horloge progresse. |
RemoveRequested |
Enlever |
Consolidation de battement et d'événement
Lorsque vous animez des objets dans WPF, c'est le moteur de minutage qui gère vos animations. Le moteur de minutage suit la progression du temps et calcule l'état de chaque animation. Il fait de telles passes d'évaluation plusieurs fois par seconde. Ces passes d'évaluation sont appelées "battements".
Alors que les battements se produisent fréquemment, il est possible que beaucoup de choses se passent entre les battements. Par exemple, une chronologie peut être arrêtée, commencé, arrêtée à nouveau, auquel cas son état actuel aura changé trois fois. En théorie, l'événement pourrait être déclenché plusieurs fois dans un seul battement ; toutefois, le moteur de minutage consolide les événements, afin que chaque événement puisse être déclenché au plus une fois par battement.
Inscription aux événements
Il y a deux méthodes pour s'inscrire aux événements de minutage : avec la chronologie ou avec l'horloge créée à partir de la chronologie. L'inscription directe à un événement avec une horloge est assez simple, même si elle ne peut s'effectuer qu'à partir de code. Vous pouvez vous inscrire aux événements avec une chronologie de balise ou de code. La section suivante décrit comment s'inscrire aux événements de minutage avec une chronologie.
S'inscrire aux événements de minuterie avec une chronologie
Bien que Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated et les événements RemoveRequested semblent être associés à la chronologie, l'inscription à ces événements associe réellement un gestionnaire d'événements au Clock créé pour la chronologie.
Lorsque vous vous inscrivez à l'événement Completed sur une chronologie, par exemple, vous indiquez en fait au système de s'inscrire à l'événement Completed de chaque horloge créée pour la chronologie. Dans le code, vous devez vous inscrire à cet événement avant que le Clock ne soit créé pour cette chronologie; sinon, vous ne recevrez aucune notification. Cela se produit automatiquement en XAML ; l'analyseur s'inscrit automatiquement à l'événement avant que le Clock ne soit créé.