C#委托方法丢失类字段/事件丢失类字段

C#委托方法丢失类字段/事件丢失类字段,c#,events,delegates,C#,Events,Delegates,请帮忙 我有几个Action1类的实例。他们每个人都应该在动画完成后导航到不同的页面 “调用”witch对象并不重要,它总是导航到同一页面 只要我在“Invoke”方法中导航,导航就会正常工作 看起来“PageAnimation_Completed”总是在同一个对象实例上调用,为什么 这是关于堆叠的吗?如何解决这个问题 我有以下课程: public class Action1 : TriggerAction<DependencyObject> { PhoneApplicati

请帮忙

我有几个Action1类的实例。他们每个人都应该在动画完成后导航到不同的页面

“调用”witch对象并不重要,它总是导航到同一页面

只要我在“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:TriggerAction
{
电话应用页面;
受保护的覆盖无效附加(){
...
页面=(PhoneApplicationPage)元素;
...
}
[System.Windows.Interactivity.CustomPropertyValueEditorAttribute(System.Windows.Interactivity.CustomPropertyValueEditor.Storyboard)]
公共情节提要页面动画{get;set;}
public static readonly dependencProperty Message=dependencProperty.Register(“IsSpinning”、typeof(Uri)、typeof(Action1)、null);
公共Uri页
{
获取{return(Uri)GetValue(Message);}
set{SetValue(消息,值);}
}
受保护的覆盖无效调用(对象o)
{
PageAnimation.Completed+=新事件处理程序(PageAnimation_Completed);
PageAnimation.Begin();
}
void PageAnimation_已完成(对象发送方,事件参数e)
{
page.NavigationService.Navigate(新Uri(“/”+this.page.OriginalString,UriKind.RelativeOrAbsolute));
PageAnimation.Stop();
}
}

您需要取消订阅
页面动画。已完成
事件:

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

您需要取消订阅
页面动画。已完成
事件:

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

非常感谢你。我为这个问题浪费了一整天的时间。但是我仍然不理解这个问题——为什么它现在可以工作?每次订阅事件时,处理程序都会被有效地添加,而不是替换。因此,每次调用Invoke时,都会将
PageAnimation\u Completed
添加到处理程序列表中,因此每次触发事件时都会调用它,即使
Begin
是从另一个实例调用的(我假设
PageAnimation
在所有实例之间共享),非常感谢。我为这个问题浪费了一整天的时间。但是我仍然不理解这个问题——为什么它现在可以工作?每次订阅事件时,处理程序都会被有效地添加,而不是替换。因此,每次调用Invoke时,都会将
PageAnimation\u Completed
添加到处理程序列表中,因此每次触发事件时都会调用它,即使
Begin
是从另一个实例调用的(我假设
PageAnimation
在所有实例之间共享)