2010-11-14 3 views
1

Пожалуйста, помогите.C# делегированный метод потерянные поля классов/поля потерянного поля события

У меня есть несколько экземпляров класса Action1. Каждый из них должен перейти на разные страницы сразу после завершения анимации.

Не имеет значения, что объект ведьмы «вызывается», он всегда переходит на ту же страницу.

До тех пор, пока я перемещаюсь по методу «Вызов», навигация работает правильно.

Похоже, что «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

Большое спасибо. Я потерял весь день для этой проблемы. Однако я до сих пор не понимаю проблему - почему она работает сейчас? –

+0

Каждый раз, когда вы подписываетесь на событие, обработчик эффективно * добавляется *, а не * заменяется *. Поэтому каждый раз, когда вы вызываете Invoke, вы добавляете 'PageAnimation_Completed' в список обработчиков, поэтому он вызывается каждый раз, когда событие срабатывает, даже если' Begin' был вызван из другого экземпляра (я предполагаю, что 'PageAnimation' разделяется между всеми экземплярами) –

Смежные вопросы