1

OnApplyTemplate()でテンプレートの子にいくつかのイベントを登録するカスタムwp7Silverlightカスタムコントロールを作成しています。

メモリリークを防ぐために、これらの登録を解除する必要があると思います。でもいつ?アンロードされたイベントを試してみます-これは機能しますが、これに問題があります。シナリオ: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います。_itemsContainerOnApplyTemplate

これがリークの原因である可能性があります。

毎回新しいものを作成する必要がありますか、それとも作成する前にnullであることを確認する必要がありますか?

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 に答える