2010-09-17 5 views
3

J'ai utilisé ce code pour l'animation ma fenêtre:Impossible de définir une propriété après son animation dans WPF

winLogin login = new winLogin(); 
login.Owner = this; 
login.Show(); 

DoubleAnimation da = new DoubleAnimation(); 
da.From = 0; 
da.To = this.Left + ((this.Width - login.Width)/2); 
da.AutoReverse = false; 
da.Duration = new Duration(TimeSpan.FromSeconds(0.1)); 
login.BeginAnimation(Window.LeftProperty, da); 

Le problème est que chaque fois que je mets la propriété Left de cette fenêtre (après l'animation), il devient fou .

J'ai utilisé ce code pour aligner les fenêtres enfants pour qu'elles soient toujours au centre, mais la propriété des fenêtres sur lesquelles j'ai utilisé une animation ne peut pas être modifiée correctement.

private void Window_LocationChanged(object sender, EventArgs e) 
{ 
     foreach (Window win in this.OwnedWindows) 
     { 
      win.Top = this.Top + ((this.Height - win.Height)/2); 
      win.Left = this.Left + ((this.Width - win.Width)/2); 
     } 
} 

Répondre

5

Tout d'abord, lorsque vous définissez une animation vous devez toujours éliminer le potentiel d'animation précédente de cette propriété:

login.BeginAnimation(Window.LeftProperty, null); 
login.BeginAnimation(Window.LeftProperty, da); 

Si vous ne le faites pas si cela vous obtiendrez une fuite de mémoire et probablement un autre comportement indésirable.

également en raison de la DependencyProperty precedence vous ne pouvez pas définir une valeur sur une DependecyProperty qui a une animation active Wich est le cas dans votre animation parce que son FillBehavior est réglé sur HoldEnd (la valeur par défaut). Encore une fois vous devez supprimer l'animation en premier.

+0

En fait, ne serait-il pas correct de définir la valeur avec SetCurrentValue? NVM, bien sûr l'animation aura toujours la priorité avec HoldEnd. –

+0

Le nouveau .NET 4 DependencyObject.SetCurrentValue est utilisé pour définir la valeur sur DependencyProperties sans affecter la valeur source de la base de données. Votre Window.LeftProperty n'est cependant pas databound. Les animations définissent la propriété directement. – bitbonk

Questions connexes