2016-04-07 6 views
0

私はMVVMCrossの私のドロイドプロジェクトで自分のtextviewのためのカウントダウンタイマーを作成したいと思います。カウントダウンMVVMCross with Xamarin Android

これは私のソリューションです: enter image description here

私はSystem.Threading.Timerを使用することはできませんので、私はこのソリューションで少し問題を抱えているので、私は自分のクラスを作成する必要があります。

しかし、私自身のクラスは、ビジネスプロジェクトでなければなりません、ので、私は、方法がわからないと、このクラスは私のUIプロジェクトと私の.Coreプロジェクトと呼ばれなければなりません...

あなたは私を助けることができますか?

は、私はこれを作った

ありがとうございますが、動作していない:SelfieBox.Businessで TimerCustomクラス

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を使用すると、Timerと同じ効果が得られます。 PCL .NET 4.5 Timer

+0

私の質問が更新されました!、Thx –

関連する問題