Heyho!
Mich hat es sehr genervt, dass es beim DispatcherTimer keine Methode zum pausieren gab. Also habe ich beschlossen eine Erweiterung in Form von einer neuen Klasse zu schreiben!
Da der "PauseTimer" von der DispatcherTimer Klasse erbt, verhält er sich genau wie ein DispatcherTimer. Bis auf die "Pause" Methode und einem neuen Attribut gibt es nichts wirklich neues was für euch von Bedeutung wäre!
Zur Pause Methode:
Es gibt einen Parameter der übergeben wird. Dieser ist vom Typ PauseStatus (Dieses Enum ist auch neu!)
und gibt an ob die Pause beginnt oder endet. Falls die Pause aufgrund von verschiedenen Gründen nicht beginnen oder
enden kann (Timer läuft garned oder ist schon gestoppt), gibt es Abfragen die Fehler verhindern.
Zum IsPaused Attribut:
Dieses Attribut ist ein Boolean und gibt an, ob der Timer Pausiert ist oder nicht.
Zur Klasse:
Im Anhang habt ihr nochmal diese Klasse mit Kommentaren!
Programm zum Veranschaulichen:
Ich habe euch noch ein Programm angehängt, das diese Klasse gleich testet.
Screen:
Bevor ichs vergesse, bitte gebt mir Feedback oder Kritik zu der Klasse (ist gern gesehen
)
und meldet Bugs oder Fehler.
Ich behebe sie gerne und update diesen Thread!
Hoffentlich hilft euch die Klasse etwas!
Es gibt einen Parameter der übergeben wird. Dieser ist vom Typ PauseStatus (Dieses Enum ist auch neu!)
und gibt an ob die Pause beginnt oder endet. Falls die Pause aufgrund von verschiedenen Gründen nicht beginnen oder
enden kann (Timer läuft garned oder ist schon gestoppt), gibt es Abfragen die Fehler verhindern.
Zum IsPaused Attribut:
Dieses Attribut ist ein Boolean und gibt an, ob der Timer Pausiert ist oder nicht.
Zur Klasse:
PHP Code:
using System;
using System.Windows.Threading;
using System.Diagnostics;
/*
Geschrieben am 19.05.2013.
Geschrieben von King Sora.
*/
public enum PauseStatus { Begin, End }
class PauseTimer : DispatcherTimer
{
private Stopwatch _observeTick;
private TimeSpan _oldInterval;
private bool _pausePossible;
private bool _timerIsPaused;
public PauseTimer() : base()
{
this._pausePossible = false;
this._observeTick = new Stopwatch();
this._oldInterval = new TimeSpan(0, 0, 0, 0, 0);
this.Tick += new EventHandler(tick);
}
public PauseTimer(DispatcherPriority priority)
: base(priority)
{
this._pausePossible = false;
this._observeTick = new Stopwatch();
this._oldInterval = new TimeSpan(0, 0, 0, 0, 0);
this.Tick += new EventHandler(tick);
}
public PauseTimer(DispatcherPriority priority, Dispatcher dispatcher)
: base(priority, dispatcher)
{
this._pausePossible = false;
this._observeTick = new Stopwatch();
this._oldInterval = new TimeSpan(0, 0, 0, 0, 0);
this.Tick += new EventHandler(tick);
}
public PauseTimer(TimeSpan interval, DispatcherPriority priority, EventHandler callback, Dispatcher dispatcher)
: base(interval, priority, callback, dispatcher)
{
this._pausePossible = false;
this._observeTick = new Stopwatch();
this._oldInterval = new TimeSpan(0, 0, 0, 0, 0);
this.Tick += new EventHandler(tick);
}
public bool IsPaused
{
get { return _timerIsPaused; }
set { }
}
public new void Start()
{
base.Start();
this._observeTick.Start();
this._pausePossible = true;
}
public new void Stop()
{
base.Stop();
_observeTick.Stop();
this._pausePossible = false;
}
public void Pause(PauseStatus pauseStatus)
{
if (pauseStatus == PauseStatus.Begin && this.IsEnabled && this._observeTick.IsRunning && this._pausePossible == true)
{
this._timerIsPaused = true;
this._oldInterval = this.Interval;
this.Interval = new TimeSpan(0, 0, 0, 0, ((int)this._oldInterval.TotalMilliseconds - (int)_observeTick.ElapsedMilliseconds));
this.Stop();
this._observeTick.Stop();
}
else if (pauseStatus == PauseStatus.End && this.IsEnabled == false && this._observeTick.IsRunning == false && this._timerIsPaused)
{
this._timerIsPaused = false;
this.Start();
this._observeTick.Start();
this.Tick += new EventHandler(tickAfterPause);
}
}
private void tickAfterPause(object sender, EventArgs e)
{
this.Interval = this._oldInterval;
this.Start();
this.Tick -= new EventHandler(tickAfterPause);
}
private void tick(object sender, EventArgs e)
{
this._observeTick.Restart();
}
}
Programm zum Veranschaulichen:
Ich habe euch noch ein Programm angehängt, das diese Klasse gleich testet.
Screen:
Bevor ichs vergesse, bitte gebt mir Feedback oder Kritik zu der Klasse (ist gern gesehen
und meldet Bugs oder Fehler.
Ich behebe sie gerne und update diesen Thread!
Hoffentlich hilft euch die Klasse etwas!






