comment faire de la Minuterie événements plus lisse dans WPF?

Dans mon application WPF, l'utilisateur appuie sur un bouton pour commencer un modèle 3D en rotation en douceur et laisse sur le bouton pour arrêter la rotation.

Pour ce faire, j'ai créer un DispatcherTimer:

DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler( timer_Tick );
timer.Interval = new TimeSpan( 0, 0, 0, 0, 30 );

Et quand le bouton est pressé j'appelle timer.Start() et lorsque le bouton est relâché j'appelle timer.Stop().

La timer_Tick modifications de la fonction de la rotation du modèle:

    void timer_Tick( object sender, EventArgs e )
    {
        spin = ( spin + 2 ) % 360;
        AxisAngleRotation3D rotation = new AxisAngleRotation3D( new Vector3D( 0, 1, 0 ), spin );
        Transform3D rotate = new RotateTransform3D( rotation );
        model2.Transform = rotate;
    }

Ce que je remarque c'est que le modèle tourne en douceur pour la plupart, mais souvent se fige et bégaie, avec une pause de différentes durées, parfois jusqu'à l'instar 1/4 de seconde.

Est-il un moyen de rendre cela plus lisse? Je comprends qu'en utilisant la Minuterie (par opposition, par exemple, du Système.Les minuteries.La minuterie), les rappels se passer sur le thread d'INTERFACE utilisateur. Mais il est nécessaire pour moi d'être sur l'INTERFACE utilisateur de la menace afin d'exécuter la ligne de

        model2.Transform = rotate;

J'ai lu sur les différentes façons d'obtenir une minuterie de rappel sur un autre thread. Mais il semble qu'à la fin j'ai à synchroniser avec le thread de l'INTERFACE utilisateur d'appeler cette ligne. Si j'utilise Invoke() de maréchal à partir, par exemple, le Système.Les minuteries.Minuterie de rappel thread le thread d'INTERFACE utilisateur, qui donnent globalement une animation plus fluide? Il me semble qu'il ne devrait pas, puisque c'est d'avoir à synchroniser avec le thread d'INTERFACE utilisateur comme DispatcherTimer sans doute. Et pour ce faire, il semble que tout système de réglage model2.Transform sur un intervalle régulier serait dans le même bateau avec le respect de la thread de l'INTERFACE utilisateur, non?

(Comme peut-être question secondaire, j'essaie de comprendre quelle en est la cause des pauses dans la première place. Autant que je sache, il n'y a rien d'autre que le thread d'INTERFACE utilisateur est en train de faire. Donc je ne comprends pas ce qui se passe pendant ces pauses. La collecte des ordures? Il ne semble pas comme il devrait y avoir beaucoup de déchets à collecter, et il ne semble pas que la pause serait tellement extrême.)

Je pense que vous pouvez utiliser model2.Répartiteur.BeginInvoke(nouvelle Action(() => { model2.Transformer = rotation; })) de l'invoquer dans model2 parent fil
Tu sais qu'en utilisant une variante de la minuterie vous avez besoin pour l'expédition de retour sur le thread de l'INTERFACE utilisateur, alors pourquoi demander si faire qui permettrait de produire de meilleurs résultats? Avez-vous essayé?
Quel type d'objet que voulez-vous tourner? Il est possible que certains éléments visuels, par exemple, des ombres portées ou les masques d'opacité, de causer un mauvais rendu de la performance...
et Daniel Kelly: j'ai utilisé le BeginInvoke() de la ligne de acrilige montre au-dessus de la minuterie, et il n'en fait donner une douceur de rotation. Henk de réponse ci-dessous est encore utile pour moi, parce que cela permet de montrer que c'est la priorité de la DispatchTimer lui-même, et pas à se synchroniser avec le thread de l'INTERFACE utilisateur, en soi, que les causes du bégaiement.
Je sais que c'est très vieux, mais si quelqu'un tombe sur cette question - je vous recommande d'utiliser le Storyboard à la place. Ce que nous voyons ici n'est pas un WPF façon de faire le rendu de transformations. Je me demande comment il fonctionne à tous.

OriginalL'auteur M Katz | 2013-01-16