2009-06-16 5 views
0

이 질문은 another one I asked과 비슷하지만이 경우 XAML 또는 뷰 모델에서 바인딩을 강제로 업데이트하도록하는 것에 대해 알고 싶었지만이 경우에는 사용자 지정 WPF FrameworkElement에 랩핑하는 방법에 대해 알고 싶습니다.매초마다 업데이트되는 WPF 컨트롤을 만드는 방법은 무엇입니까?

내가 수행 한 기능은 일정 기간 전에 어떤 일이 있었는지 나타내는 텍스트 범위입니다.

<TextBlock Text="It happened " /> 
<my:AgeTextBlock SinceTime="{Binding OccurredAtUtc}" /> 
<TextBlock Text=" ago" /> 

이 (예를 들어)로 렌더링 것이다 : 그것은 13 초 전에 1 분을 무슨 일이 있었

나는 사람이 읽을 수에 TimeSpan에서 변환 코드를 양식을 표시합니다.

UI를 매 초마다 업데이트하려면 정적 DispatcherTimer (아이디어는 Kent Boogaart's answer)을 사용하는 것이 좋습니다.

그래서 여기에 내가 가진 무엇 :

public class AgeTextBlock : TextBlock 
{ 
    private static readonly DispatcherTimer _timer; 

    static AgeTextBlock() 
    { 
     _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; 
    } 

    public AgeTextBlock() 
    { 
     _timer.Tick += ...; 
    } 

    // How can I unsubscribe from the Tick event to avoid a memory leak? 
} 

코멘트가 내 문제가 있음을 나타냅니다. 이 방법으로 제대로 정리할 방법을 알 수 없습니다. 이벤트 처리기를 재정의하고 제거하는 방법은 Dispose입니다.

여기에 권장되는 패턴은 무엇입니까?

답변

4

컨트롤의 Loaded 이벤트에서 Tick 이벤트를 구독하고 Unloaded 이벤트에서 구독을 취소하는 이유는 무엇입니까?

2

TextBlock이 IDisposable을 구현하지 않는다고해서 인터페이스 요구 사항과 구현을 직접 추가 할 수 없다는 것을 의미하지는 않습니다. 당신은 자신을 처분 (기본에서 아무것도 덮어 쓰지 않음)하고 거기에 타이머를 폐기 구현할 수 있습니다.

귀하는 AgeTextBlock 클래스 처분에 대한 책임을지게됩니다. 예를 들어 윈도우 닫는 이벤트 나 이와 비슷한 이벤트에서이 작업을 수행 할 수 있습니다.

(당신이 MVVM pattern를 수행하고 뷰 모델에 타이머를 넣어 경우 다른 방법으로, 당신은 당신의보기 모델는 IDisposable을 만들 수있는 그냥보기 모델에 대한 타이머 값에 뷰를 바인딩합니다.)

[편집] : 예, 이것에 대해 생각해 보니, 저는 이것이 Winforms와는 다른 커스텀 컨트롤이어야한다고 생각하지 않습니다. WPF는 커스텀 컨트롤을 필요로하지 않습니다. 대신 뷰 모델에 타이머 속성을 노출시킬 것입니다. 사전 형식화 된 속성을 사용하여 멋진 문자열을 읽을 수 있음) 일반 텍스트 상자 (사용자 정의 컨트롤 없음)에 해당 속성을 바인딩합니다. 그런 다음 스타일이나 템플릿을 사용하여 텍스트 상자의 시각적 속성을 조정하여 원하는 방식으로 표시합니다. 어떻게 소리가 나지?]

+0

안녕하세요. 대답 주셔서 감사합니다. 그러나 처분에 대한 추적 인스턴스가 매우 우아하다고 생각하지 않습니다. 예를 들어 ItemsControl DataTemplate에서이 요소를 사용하는 경우를 생각해보십시오. 원래 뷰 모델에서 속성 변경 사항을 실행하는 방법을 설정 했었지만이 코드를 상당 부분 사용하고 상당한 양의 코드 복제를 도입합니다. 그래서, 나는 여전히 이것을 할 수있는 좋은 방법을 찾고 있습니다. –

+0

편집과 관련하여 정중히 동의합니다. 내 뷰 모델에는 속성 (시간이있을 때)이 있으며, 내가 제시하고자하는 방식은 텍스트의 문자열을 통해 얼마나 오래되었는지 나타냅니다.Dispatcher, 문자열 포맷팅, 속성 변경 알림 및 자원 할당 해제에 대한 정보를 내보기 모델에 도입하여 UI에서보다 우아하게 수행 할 수있는 기능을 지원하기를 원하지 않습니다. –

+0

@Drew : 1) WPF 디자인의 일부는 앱의 GUI 부분에 관리되지 않는 메모리가 포함되어 있지 않다는 것입니다. GUI 코드에 타이머를 포함시킴으로써 타이머가 관리되지 않는 객체에 대한 참조를 포함한다는 전제를 깨뜨린 것이므로 불행히도이를 해결할 수있는 우아한 방법이 없다고 생각합니다. 나는 당신이 하나를 발견하면 매우 흥미 롭습니다, 제가 전에 몇 번 건너 온 문제이고, 당신이 말하는 것처럼, 나는 특별히 만족스러운 것을 생각해 내지 못합니다. 어쩌면 WPF 애니메이션 기능을 활용할 수 있습니다. 어둠 속에서도 매우 강한 찌르기입니다. –