2011-02-05 8 views
6

WPFでコントロールを正しく削除する方法については、StackOverflowで質問されている質問を参照してください。一般的には、手動で処理しない(または処理できない)というコメントがいくつかあります。参照を保持していない限り、最終的にGCによってクリアされます。偶然、私が削除したと思ったコントロールの1つが、親から削除したにもかかわらず、やっていることに気づいた。WPF - DispatcherTimerを持つコントロールを削除しても消えていないようです

できるだけ少ない行でサンプルを再作成しました。コントロールにはDispatcherTimerがあります。 削除したいコントロールの背後にあるWPFコードを次に示します。

私のコントロールを追加したり削除したりするためのコードです。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void AddClicked(object sender, RoutedEventArgs e) 
    { 
     anyControlHolder.Children.Add(new MyControl()); 
    } 

    private void RemoveClicked(object sender, RoutedEventArgs e) 
    { 
     anyControlHolder.Children.Clear(); 
    } 
} 

私はこのコードを実行して、動的にカスタムユーザーコントロール(MyControlと)を追加および削除するとき私がいる問題は、それがタイマーであるということです(この例ではあなたはそれが中にメッセージを書き出す見ることができます刻み続けます出力ウィンドウ)、チックイベントで作業を続けます。 少なくとも、コントロールが削除されたときにタイマーを止めるのにどのようなパターンを使用する必要がありますか?

+0

アンロードされたイベントを追加しても動作しているようです。 WeakEventPatternも見ているは​​ずです。誰にもこれに関する提案はありますか?プライベートvoid UserControl_Unloaded(オブジェクト送信者、System.Windows.RoutedEventArgs e) { timer.Stop(); } – DTig

+0

シャックス、私は甘い例とすべてをまとめる...あなたのコメントに気付かなかった!私は実際にWeakEventPatternを自分で調べたことはありません - 私の最初の検索でこれが得られました:http://msdn.microsoft.com/en-us/library/aa970850.aspx私もそれを見ていきます! – Pwninstein

答えて

2

もう一つは、あなたのtickイベントのために追加したイベントハンドラを削除することです。手動で追加するものはすべて削除する必要があります。限り、あなたは、あなたがあなたのコントロールのアンロードイベントにフックや内部timer.Stop()を呼び出すことができます。このarticle

4

を見てみたいことがありWeakEventPatternを実装するよう
。私はこのシナリオをテストしましたが、anyControlHolder.Children.Clear()が呼び出されたときにUnloadedイベントが発生し、デバッグメッセージが停止しました。

コード:

public partial class MyControl : UserControl { 
    private DispatcherTimer timer; 

    public MyControl() { 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(MyControl_Loaded); 
     this.Unloaded += new RoutedEventHandler(MyControl_Unloaded); 
    } 

    void MyControl_Loaded(object sender, RoutedEventArgs e) { 
     timer = new DispatcherTimer(); 
     timer.Tick += TimerOnTick; 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Start(); 
    } 

    void MyControl_Unloaded(object sender, RoutedEventArgs e) { 
     timer.Stop(); 
    } 

    private void TimerOnTick(object sender, EventArgs args) { 
     Debug.WriteLine("Tick From MyControl."); 
    } 
} 

は、この情報がお役に立てば幸い!

関連する問題