2011-04-14 3 views
1

내 뷰 중 하나에서 사용되는 범위 슬라이더 인 사용자 지정 컨트롤이 있습니다.WPF 컨트롤의 이벤트 구독 취소

생성자는 다음과 같습니다 : 그 이벤트 핸들러를 unscubscribe 수있는 방법을 때/I 모르는

 EventHandler ReCalculateWidthsHandler; 
     public RangeSlider() 
     { 
      ReCalculateWidthsHandler = OnReCalculateWidths; 
      DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(RangeSlider)). 
       AddValueChanged(this, ReCalculateWidthsHandler); 
     } 

. 컨트롤에는 Dispose 메서드가 없습니다. 구독 한 이벤트를 구독 취소 할 수 있도록 컨트롤이 삭제/제거되고 있다는 알림을받을 수있는 방법이 있습니까?

이것은 더 일반적인 질문 일 수 있습니다. Control을 확장하는 사용자 지정 컨트롤을 감안할 때, 어떻게 처리되는지 알 수 있습니까?

감사합니다.

답변

2

일반적으로 종속성 속성의 변경 핸들러를 추가하려면 OverrideMetadata을 사용해야합니다. 불행히도 읽기 전용 속성에서는 작동하지 않습니다. 그래서 내가 생각하는 속성 설명자를 사용합니다. AddValueChanged는 메모리 누수의 원인이되는 정적 인 강력한 참조를 저장하기 때문에이 방법은 너무 복잡합니다. 속성 설명자를 구독하는 대신 SizeChanged 이벤트에서 ReCalculateWidthsHandler를 호출해야한다고 생각합니다.

+0

정기적으로 SizeChanged 이벤트에 가입하도록 변경 한 경우 컨트롤이 삭제 될 때 해당 이벤트의 구독을 취소 할 위치는 어디입니까? 내가 구독을 취소하지 않으면 내가 메모리 누출로 남아 있지 않을까? – Flack

+0

아니요. 동일한 인스턴스의 이벤트에 대한 처리기를 구독하는 경우 외부 참조가 없습니다. –

+0

아, 네. 그게 내 마음을 미끄러 져. 다른 컨트롤이 내 사용자 정의 컨트롤에 전달되었고 사용자 정의 컨트롤이 otherControl.SomeEvent + = SomeEventHandler와 같은 이벤트 중 하나에 가입했다고 가정 해 봅시다. 내 custom 컨트롤은 언제 그 이벤트로부터 구독을 취소하여 otherControl에 대한 참조가 유지되지 않습니까? – Flack