2016-04-07 4 views
0

Я хочу создать таймер обратного отсчета для моего текста в моем проекте дроида в MVVMCross.Обратный отсчет MVVMCross с Xamarin Android

Это мое решение: enter image description here

У меня есть небольшая проблема с этим решением, потому что я не могу использовать System.Threading.Timer, так что мне нужно, чтобы создать свой собственный класс.

Но я не знаю, как, потому что мой собственный класс должен быть в бизнес-проект, и этот класс должен быть вызван с моим проектом .Core с моим UI проекта ...

Можете ли вы мне помочь?

Спасибо

Я сделал это, но не работает: TimerCustom класса в 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; 
      } 
     } 
    } 
} 

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

И на мой взгляд, в 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"/> 

Мой таймер снизился красиво, но она не отображается на моем экране

ответ

2

Проблема в том, что в вашей модели ViewModel вы никогда не реагируете на изменения в вашем таймере, и вы никогда не вызываете RaisePropertyChanged.

Так что я бы изменить таймер на то, как это вместо:

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

Таким образом, вы можете в случае, если он выставляет обновления ваш ViewModel соответственно:

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

Убедитесь, что ValueOfTimer поднять PropertyChanged :

private int _valueOfTimer; 

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

Работайте хорошо! Очень благодарю вас, Чизбарон! –

0

Вы можете использовать Task.Delay, чтобы получить тот же эффект, как таймер дает вам. См. Этот ответ для получения более подробной информации: PCL .NET 4.5 Timer

+0

Я обновил свой вопрос!, Thx –

 Смежные вопросы

  • Нет связанных вопросов^_^