2011-01-15 4 views
0

私は、別のページに移動する前に実行されるWindows Phone 7 Silverlight Appに次のコードを記述しています。デリゲートの使用方法は? (WPF Storyboardsを例として使用)

Storyboard storyboard = Resources["TurnstileBackwardOut"] as Storyboard; 
Storyboard.SetTarget(storyboard, LayoutRoot); 
storyboard.Completed += delegate 
    { 
     storyboard.Stop(); 
     Debug.WriteLine("LeavePageStoryboard.Completed"); 
     NavigationService.Navigate(uri); 
    }; 
storyboard.Begin(); 

ストーリーボードはリソース内にあり、頻繁に再利用されます。私が理解しているように、コードが実行されるたびに、新しいデリゲートがCompletedイベントに追加されます。私の質問は、Completedイベントからデリゲートを削除する必要がありますか?

他のページでもストーリーボードを使用しているため、しばらくしてから、多くのデリゲートが存在し、そのうちのいくつかは現在のページに属しません。

答えて

3

「LeavePageStoryboard.Completed」のコピーが多数表示されるため、ナビゲートすると問題があるかどうかを知ることができます。しかし、毎回新しいストーリーボードを作成しない限り、それはであると思われます。しかし、修正するのは簡単です:

2

これはC#のメモリリークと共通の問題です。頻繁に再利用される長期間保存されたオブジェクトを持っている場合は、イベントハンドラがそれを積み重ねるのが一般的です。

カップルのオプションがあります。

1)あなたの代理人が匿名ではないことを確認します。そのロジックと参照されたデリゲートを保持するメソッドを作成します。次に、ストーリーボードで作業が完了したら、この参照されたデリゲートを削除します。

2)ストーリーボードを長期間使用しないでください。 1つの可能性は、代わりにそれをDataTemplateにして、その新しいコピーをインスタンス化することです。それから、あなたが望むすべてのイベントハンドラをアタッチすることができます。ガベージコレクションが完了すると、ガベージコレクションも行われます。

関連する問題