1

我正在创建一些自定义 wp7 silverlight 自定义控件,这些控件在 OnApplyTemplate() 中的模板子项上注册一些事件。

我想我必须取消注册这些以防止内存泄漏。但当?我会尝试 unloaded 事件 - 这有效,但我有这个问题。场景:在 Page1 我有我的自定义控件。然后从 Page1 导航到 Page2 调用我的自定义控件的 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;
    }
}
4

2 回答 2

2

我相信你想要的是这样的。:)

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

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

更新

好的,这就是我在自定义控件中执行此操作的方式。

        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);
        }
于 2011-12-23T11:27:36.810 回答
0

ItemsControl_itemsContainer每次OnApplyTemplate调用时都在创建一个新的。

这可能是泄漏的来源。

您是否需要每次都创建一个新的,或者您是否应该在创建它之前检查它是否为空:

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;
    }
}
于 2011-12-23T12:18:02.403 回答