2011-12-23 79 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