2011-12-23 43 views
1

我創建了一些自定義wp7 silverlight自定義控件,它們在OnApplyTemplate()中的模板子模板上註冊了一些事件。SL自定義控件:取消註冊事件以防止內存泄漏?

我想我必須取消註冊這些以防止內存泄漏。但當?我會嘗試卸載的事件 - 這有效,但我有這個問題。 場景: 在Page1我有我的自定義控件。然後,從Page1導航到第2頁,調用我的自定義控件的Unloaded事件。到現在爲止還挺好。但後來我回到我的自定義控件的事件沒有再次註冊,因此沒有任何反應,然後使用該控件。

然後,我應該正確地註冊和取消註冊事件,一切按預期工作,我不能創建內存泄漏?

感謝您的幫助!

編輯:

這裏我OnApplyTemplate()方法的一個例子:

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    _itemsContainer = GetTemplateChild("PART_Items") as ItemsControl; 
    if (_itemsContainer != null) 
    { 
     // When to detach this event for correctly object lifetime? 
     _itemsContainer.Tap += ItemsContainer_Tap; 
    } 
} 

回答

2

我相信你想要的東西是這樣的。 :)

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    this.YourEvent -= new RoutedEventHandler(YourEventHandler); 
    this.YourEvent += new RoutedEventHandler(YourEventHandler); 
    ... 
} 

UPDATE

好吧,這是我在我的自定義控件做到這一點。

 if (this._resizer != null) 
     { 
      this._resizer.DragStarted -= new DragStartedEventHandler(Resizer_DragStarted); 
      this._resizer.DragCompleted -= new DragCompletedEventHandler(Resizer_DragCompleted); 
      this._resizer.MouseMove -= new MouseEventHandler(Resizer_MouseMove); 
     } 

     this._resizer = this.GetTemplateChild("Resizer") as Thumb; 

     if (this._resizer != null) 
     { 
      this._resizer.DragStarted += new DragStartedEventHandler(Resizer_DragStarted); 
      this._resizer.DragCompleted += new DragCompletedEventHandler(Resizer_DragCompleted); 
      this._resizer.MouseMove += new MouseEventHandler(Resizer_MouseMove); 
     } 
+0

謝謝,但我認爲這不是我的目標。我已經添加了一個清晰示例的示例。 – 2011-12-23 12:14:42

+0

我更新了我的答案。 – 2011-12-23 12:39:56

+0

+1,但我也在該字段周圍放置一個屬性,並將此代碼放置在setter中以避免混淆OnApplyTemplate。 – AnthonyWJones 2011-12-23 14:26:28

0

您正在創建一個新的ItemsControl_itemsContainerOnApplyTemplate時間被調用。

這可能是泄漏的根源。

你需要創建一個新的每次或創建之前,您應該被檢查它是空:

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    if (_itemsContainer == null) 
    {  
     _itemsContainer = GetTemplateChild("PART_Items") as ItemsControl; 
     if (_itemsContainer != null) 
     { 
      // When to detach this event for correctly object lifetime? 
      _itemsContainer.Tap += ItemsContainer_Tap; 
     } 
    } 
} 

如果它需要得到重建,那麼你可能需要刪除的事件處理程序:

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    if (_itemsContainer != null) 
    { 
     _itemsContainer.Tap -= ItemsContainer_Tap; 
    } 

    _itemsContainer = GetTemplateChild("PART_Items") as ItemsControl; 
    if (_itemsContainer != null) 
    { 
     // When to detach this event for correctly object lifetime? 
     _itemsContainer.Tap += ItemsContainer_Tap; 
    } 
} 
+0

第一種方法確實有意義。但是,然後我分離註冊的點擊事件? Unloaded事件對我來說不起作用,因爲然後頁面導航發生Unloaded事件被觸發(到目前爲止確定),但OnApplyTemplate(9)和調用ApplyTemplate()的Loaded事件被調用,然後導航回來,以便ItemsControl不響應輕擊事件,因爲nmy處理程序未註冊。 – 2011-12-23 12:24:00