in

dotNet Umbria

Il primo User Group in Umbria sul mondo .Net

Articoli

Articoli vari degli iscritti a DotNetUmbria

Wpf - Animazioni (2D e 3D) con DoubleAnimation

Sviluppando un progetto, mi sono trovato a dover implementare una animazione. Semplicemente, il mio oggetto 3D alla pressione di una determinata combinazione di tasti deve allontanarsi dal punto di vista dell'utente e quindi scorrere negativamente sull'asse z, ricordiamoci la regola della mano destra:

righthand

Per far questo ho creato un oggetto DoubleAnimation che non è altro che un semplice interpolatore. Basta definire pochi valori per avere un'animazione semplice ma funzionale.

[code language="xml"]

DoubleAnimation animazione= new DoubleAnimation();

...

animazione.To = -100; //valore di fine interpolazione
animazione.Duration = new Duration(TimeSpan.Parse("0:0:0.5")); //durata dell'animazione
Oggetto3D.BeginAnimation(TranslateTransform3D.OffsetZProperty, animazione); //applico l'interpolatore alla proprietà dell'oggetto 3D

[/code]

Come vedete, non ho impostato il valore di inizio interpolazione perché, come per l'altro mio post, anche qui l'interpolatore prende in automatico, come punto di partenza, il valore attuale (in questo caso la posizione attuale sull'asse Z).

Fin qui tutto ok. Quando però successivamente, in un altra parte del programma, ho tentato di cambiare ulteriormente la distanza del mio oggetto, questa volta senza animazione

[code language="xml"]

Oggetto3D.OffsetZ = -50;

[/code]

questo mi è risultato impossibile. Mettendo un breakpoint sull'assegnazione, vedevo chiaramente che l'operazione avveniva ma che, apparentemente almeno, era totalmente ignorata e che quindi la traslazione sull'asse Z del mio oggetto restava -100.

Dopo un discreto tempo passato su msdn ho trovato motivo e soluzione al mio problema.

L'interpolatore, anche se arrivato a fine "ciclo" rimane comunque attivo, continuando a impostare a -100 il valore della mia traslazione.

Per ovviare al problema, basta "scollegare" l'oggetto DoubleAnimation dalla proprietà OffsetZProperty

[code language="xml"]

Oggetto3D.BeginAnimation(TranslateTransform3D.OffsetZProperty, null);
Oggetto3D.OffsetZ = -50;

[/code]

impostando come "null" l'interpolatore addetto alla modifica della property.

Spero di essere stato d'aiuto.

Un saluto a tutta la community.

Only published comments... May 05 2008, 04:11 PM by Daniele Balbini
Filed under:
dotNet Umbria 2007-2008
Powered by Community Server (Commercial Edition), by Telligent Systems