この質問は、私が尋ねた別の質問と似ていますが、その場合はバインディングを XAML またはビュー モデルから強制的に更新することについて知りたいのですが、この場合はこれをカスタム WPF にラップすることについて知りたいFrameworkElement
です。
私が求めている機能は、何かが起こってからどれくらい経ったかを示す一連のテキストです。
<TextBlock Text="It happened " />
<my:AgeTextBlock SinceTime="{Binding OccurredAtUtc}" />
<TextBlock Text=" ago" />
これは次のようにレンダリングされます (例):
1 分 13 秒前に発生しました
TimeSpan
aから人が読める形式に変換するコードがあります。
UI を毎秒更新するために、静的DispatcherTimer
( Kent Boogaart の回答からのアイデア) の使用を検討しています。
だからここに私が持っているものがあります:
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
イベント ハンドラーをオーバーライドして削除する方法はありません。
ここで推奨されるパターンは何ですか?