Frage

Diese Frage ist ähnlich href="https://stackoverflow.com/questions/949458/"> ein anderes , aber während in diesem Fall wollte ich zu zwingen, eine Bindung wissen Update von XAML oder einem view-Modell, in diesem Fall würde Ich mag über Einwickeln diese bis in eine benutzerdefinierten WPF FrameworkElement kennen.

Die Funktionalität, die ich bin nach ist eine Spanne von Text, der angibt, wie lange es her ist etwas passiert.

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

Dieses Beispiel würde wie (zum Beispiel):

  

Es geschah 1 min 13 sec vor

Ich habe Code, der von einem TimeSpan gezeigt an den Menschen lesbare Form umwandelt.

Um das UI-Update zu haben jede Sekunde mir erwägen, mit einer statischen DispatcherTimer (Idee von Kent Boogaart Antwort ).

Also hier ist, was ich habe:

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

Der Kommentar zeigt mein Problem. Ich kann nicht sehen, wie ich mit diesem Ansatz richtig aufzuräumen würde. Es gibt keine Dispose Methode außer Kraft zu setzen und die Event-Handler zu entfernen.

Was ist das empfohlene Muster hier?

War es hilfreich?

Lösung

Warum abonniert nicht auf das Tick-Ereignis in dem Loaded-Ereignisse der Kontrolle und im unbelasteten Fall abmelden?

Andere Tipps

Nur weil TextBlock- IDisposable nicht implementiert bedeutet nicht, Sie nicht die Schnittstelle Anforderung hinzufügen und die Umsetzung selbst. Sie können selbst implementieren entsorgen (nicht von der Basis überschreibt alles), und es Ihren Timer entsorgen.

Sie werden natürlich dann für die Entsorgung Ihrer AgeTextBlock Klasse verantwortlich. Sie werden könnten dieses Ereignis zum Beispiel oder so etwas in Ihrem Fenster tun zu schließen.

(Alternativ folgen, wenn Sie die MVVM Muster , und setzen Sie Ihren Timer auf dem view-Modell, könnten Sie die Ansicht Modell IDisposable und nur binden, den Blick auf den Timer-Wert auf dem view-Modell).

machen

[Edit: Ja, darüber nachgedacht, ich glaube nicht, das wirklich eine individuelle Steuerung im Gegensatz zu WinForms sein soll, ist WPF hat keine solche Notwendigkeit für benutzerdefinierte Steuerelemente, statt ich glaube, ich eine Timer-Eigenschaft aussetzen würde auf meinem view-Modell (möglicherweise ein vorformatierte Eigenschaft, so dass Sie einen schönen lesbaren String haben) und bindet diese Eigenschaft zu einem normalen Textfeld - keine Zollkontrolle - dann würde ich einen Stil oder eine Vorlage verwenden, um die visuellen Eigenschaften des Textfeldes zwicken aussehen wie ich wollte. Wie klingt das?]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top