2011-12-23 4 views
1

OnApplyTemplate()의 템플릿 하위에 일부 이벤트를 등록하는 사용자 지정 wp7 Silverlight 사용자 지정 컨트롤을 만듭니다.SL 사용자 지정 컨트롤 : 메모리 누수를 방지하기 위해 이벤트를 등록 취소 할 때?

나는 메모리 누출을 막기 위해 이들을 등록 해제해야한다고 생각합니다. 하지만 때? 나는 언로드 된 이벤트를 시도 할 것입니다 -이 작동하지만이 문제가 있습니다. 시나리오 : 페이지 1 사용자 정의 컨트롤이 있습니다. 그런 다음 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; 
    } 
} 

답변

2

내가 당신이 원하는 것은이 같은 믿습니다. :)

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

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

UPDATE

그래,이게 내가 내 사용자 지정 컨트롤에서이 작업을 수행하는 방법이다. 당신은 새로운 ItemsControl_itemsContainer의 모든 시간 OnApplyTemplate를 만드는

 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

감사하지만 내 목표가 아닌 것 같습니다. 예를 들어 명확한 예제를 추가했습니다. –

+0

내 대답이 업데이트되었습니다. –

+0

+1 필드 주위에 Property를 배치하고 OnApplyTemplate을 어수선하게 다루지 않으려면이 코드를 setter에 넣으십시오. – AnthonyWJones

0

가 호출됩니다.

누출의 원인 일 수 있습니다. 그 다음 다시받을 필요가없는 경우

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; 
     } 
    } 
} 

하는 이벤트 핸들러를 제거해야 할 수 있습니다

는 새 매번 작성해야합니다 또는 당신이 그것을 만들기 전에이 null 인 검사해야합니까 :

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 핸들러가 등록되어 있지 않기 때문에 tap 이벤트에 응답하지 않습니다. –