2016-04-07 22 views
0

MVVMCross'taki droid projemde metin görüşüm için bir geri sayım sayacı oluşturmak istiyorum. i System.Threading.Timer kullanamazsınız çünkü bu çözüm ile küçük bir sorun var, bu yüzden ben kendi sınıf oluşturmak gerekir enter image description hereXamarin Android ile Geri Sayım MVVMCross

:

Bu benim çözümdür.

Ama çünkü benim kendi sınıf İş Projesi olmalı ve bu sınıf benim UI Projesi ile benim .Core proje ile çağrılmalıdır nasıl bilmiyorum ... Bana

yardımcı olabilir misiniz?

Bunu yapan

teşekkür ederim ama çalışmıyor: SelfieBox.Business içinde TimerCustom sınıf

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

ViewModel SelfieBox.Core içinde:

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

Ve görünümü, içinde 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"/> 

Benim zamanlayıcı güzel azalmış, ancak Zamanlayıcı verir aynı etkiler elde etmek için Task.Delay kullanabilirsiniz ekranımda

cevap

2

Sorun şu ki, ViewModel'inizde, zamanlayıcınızdaki değişikliklere hiçbir zaman tepki vermiyorsunuz ve hiçbir zaman RaisePropertyChanged numaralı telefonu da aramıyorsunuz.

Yani artık şöyle bir şey için zamanlayıcı değiştirecek:

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); 
     } 
    } 
} 

buna göre güncelleme ViewModel ortaya durumunda yapabilirsiniz Bu yol:

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

ValueOfTimer PropertyChanged yükseltmek emin olun :

private int _valueOfTimer; 

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

Work nice! Gerçekten teşekkürler Cheesebaron! –