2010-11-14 4 views
1

Aidez-nous s'il vous plaît.C# méthode déléguée champs de classe perdus/événement champs de classe perdus

J'ai plusieurs instances de classe Action1. Chacun d'eux devrait naviguer vers des pages différentes juste après l'animation terminée.

Peu importe si l'objet est "Invoqué", il navigue toujours vers la même page.

Tant que je navigue dans la méthode "Invoke", la navigation fonctionne correctement.

Il semblerait que "PageAnimation_Completed" soit appelée tout le temps sur la même instance d'objet, pourquoi?

Est-ce quelque chose à propos de Stacks and Heaps? Comment résoudre ce problème?

J'ai la classe suivante:

public class Action1 : TriggerAction<DependencyObject> 
{ 
    PhoneApplicationPage page; 

    protected override void OnAttached() { 
     ... 
     page = (PhoneApplicationPage)elem; 
     ... 
    } 

[System.Windows.Interactivity.CustomPropertyValueEditorAttribute(System.Windows.Interactivity.CustomPropertyValueEditor.Storyboard)] 
    public Storyboard PageAnimation { get; set; } 

    public static readonly DependencyProperty Message = DependencyProperty.Register("IsSpinning", typeof(Uri), typeof(Action1), null); 
    public Uri Page 
    { 
     get { return (Uri)GetValue(Message); } 
     set { SetValue(Message, value); } 
    } 



    protected override void Invoke(object o) 
    { 
     PageAnimation.Completed += new EventHandler(PageAnimation_Completed); 
     PageAnimation.Begin(); 
    } 

    void PageAnimation_Completed(object sender, EventArgs e) 
    { 
     page.NavigationService.Navigate(new Uri("/" + this.Page.OriginalString, UriKind.RelativeOrAbsolute)); 
     PageAnimation.Stop(); 
    } 
} 

Répondre

1

Vous devez vous désabonner de l'événement PageAnimation.Completed:

void PageAnimation_Completed(object sender, EventArgs e) 
{ 
    PageAnimation.Completed -= PageAnimation_Completed; 
    page.NavigationService.Navigate(new Uri("/" + this.Page.OriginalString, UriKind.RelativeOrAbsolute)); 
    PageAnimation.Stop(); 
} 
+0

Merci beaucoup. J'ai perdu toute la journée pour ce problème. Cependant, je ne comprends toujours pas le problème - pourquoi cela fonctionne-t-il maintenant? –

+0

Chaque fois que vous vous abonnez à un événement, le gestionnaire est effectivement * ajouté *, pas * remplacé *. Ainsi, chaque fois que vous appelez Invoke, vous ajoutez 'PageAnimation_Completed' à la liste des gestionnaires, ainsi il est appelé chaque fois que l'événement se déclenche, même si' Begin' a été appelé depuis une autre instance (je suppose que 'PageAnimation' est partagé entre toutes les instances) –

Questions connexes