2010-11-14 99 views
1

請幫忙。C#委託方法丟失類字段/事件丟失類字段

我有幾個Action1類的實例。他們每個人都應該在完成動畫後導航到不同的頁面。

女巫對象無所謂「被調用」,它總是導航到相同的頁面。

只要我在「Invoke」方法中導航,導航就能正常工作。

它看起來像「PageAnimation_Completed」一直在同一個對象實例上調用,爲什麼?

這是關於堆棧和堆?如何解決這個問題?

我有以下類:

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(); 
    } 
} 

回答

1

你需要從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

非常感謝你。這個問題我整天都失去了。 但是我仍然不明白這個問題 - 爲什麼它現在有效? – 2010-11-14 10:33:40

+0

每次訂閱事件時,處理程序都會有效*添加*,而不是*替換*。因此,每次調用Invoke時,都會將'PageAnimation_Completed'添加到處理程序列表中,所以每次事件觸發時都會調用它,即使'Begin'是從另一個實例調用的(我假設在所有實例之間共享了「PageAnimation」 ) – 2010-11-14 13:42:57