2016-04-07 31 views
0

Ich möchte einen Countdown-Timer für meine Textansicht in meinem Droid-Projekt in MVVMCross erstellen.Countdown MVVMCross mit Xamarin Android

Dies ist meine Lösung: enter image description here

ich ein kleines Problem mit dieser Lösung habe, weil ich nicht System.Threading.Timer verwenden kann, so brauche ich meine eigene Klasse zu erstellen.

Aber ich weiß nicht wie, weil meine eigene Klasse im Business-Projekt und diese Klasse sein muss, muss mit meinem .CORE Projekt mit meinem UI-Projekt ...

Können Sie mir helfen genannt werden?

Danke

ich das gemacht, aber nicht funktioniert: TimerCustom Klasse in SelfieBox.Business

public class TimerCustom 
{ 
    private int _valueOfTimer; 
    private bool _timerRunning; 

    public int ValueOfTimer 
    { 
     get { return _valueOfTimer; } 
     set { _valueOfTimer = value; } 
    } 

    public TimerCustom(int valueOfTimer) 
    { 
     _valueOfTimer = valueOfTimer; 
    } 

    public async Task<TimerCustom> Start() 
    { 
     if (!_timerRunning) 
     { 
      _timerRunning = true; 
      await RunTimer(); 
     } 

     return this; 
    } 

    private async Task RunTimer() 
    { 
     while (_timerRunning && _valueOfTimer > 0) 
     { 
      await Task.Delay(1); 

      _valueOfTimer--; 

      if (_valueOfTimer == 0) 
      { 
       _timerRunning = false; 
      } 
     } 
    } 
} 

Ansichtsmodell in SelfieBox.Core:

public class SecondStep_Photo_ViewModel : MvxViewModel 
{ 
    private Business.Models.TimerCustom _timerCustom; 

    #region Prop => Value Of Timer 
    private int _valueOfTimer; 

    public int ValueOfTimer 
    { 
     get { return _valueOfTimer; } 
     set { _valueOfTimer = value; } 
    } 
    #endregion 


    public SecondStep_Photo_ViewModel() 
    { 
     _timerCustom = new Business.Models.TimerCustom(5); 
     _timerCustom.Start(); 

     ValueOfTimer = _timerCustom.ValueOfTimer; 
    } 
} 

Und meiner Ansicht nach in SelfieBox.Droid:

...<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/TxtTimer" 
    android:textSize="200dp" 
    android:textStyle="bold" 
    android:gravity="center" 
    android:visible="false" 
    android:layout_centerInParent="true" 
    local:MvxBind="Text ValueOfTimer; Visible DisplayTimer"/> 
schön

verringert Mein Timer, aber es nicht auf meinem Bildschirm angezeigt wird

Antwort

2

Das Problem ist, dass Sie in Ihrem ViewModel nie auf die Änderungen in Ihrem Timer reagieren und Sie nie RaisePropertyChanged entweder aufrufen.

public class Timer 
{ 
    private bool _started; 

    public int Time { get; private set; } 
    public event EventHandler<int> TimeElapsed; 

    public Timer(int startTime) 
    { 
     Time = startTime; 
    } 

    public async Task StartAsync(CancellationToken token = default(CancellationToken)) 
    { 
     if (_started) return; 

     _started = true; 

     while (_started && Time > 0) 
     { 
      // wait 1000 ms 
      await Task.Delay(1000, token).ConfigureAwait(false); 
      if (--Time == 0) 
      { 
       _started = false; 
      } 
      TimeElapsed?.Invoke(this, Time); 
     } 
    } 
} 

diese Weise können Sie im Falle kann es Update Ihr Ansichtsmodell setzt dementsprechend:

So würde ich den Timer zu so etwas wie dieses stattdessen ändern

var timer = new Timer(5); 
timer.TimeElapsed += (s, t) => ValueOfTimer = t; 
timer.StartAsync(); 

Stellen Sie sicher, dass ValueOfTimer Property erhöhen :

private int _valueOfTimer; 

public int ValueOfTimer 
{ 
    get { return _valueOfTimer; } 
    set { 
     _valueOfTimer = value; 
     RaisePropertyChanged(() => ValueOfTimer); 
    } 
} 
+0

Arbeit nett! Wirklich danke Cheesebaron! –

0

Sie Task.Delay verwenden können, das gleiche zu bekommen beeinflussen wie Timer gibt Ihnen. Finden Sie diese Antwort für weitere Details: PCL .NET 4.5 Timer

+0

Ich habe meine Frage aktualisiert!, Thx –

Verwandte Themen