【问题标题】:Countdown MVVMCross with Xamarin Android倒计时 MVVMCross 与 Xamarin Android
【发布时间】:2016-04-07 16:30:38
【问题描述】:

我想在 MVVMCross 的 droid 项目中为我的 textview 创建一个倒数计时器。

这是我的解决方案:

我对这个解决方案有一点问题,因为我不能使用 System.Threading.Timer,所以我需要创建自己的类。

但我不知道怎么做,因为我自己的类必须在业务项目中,并且必须使用我的 .Core 项目和我的 UI 项目调用这个类...

你能帮帮我吗?

谢谢

我做了这个,但没有工作: 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;
            }
        }
    }
}

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"/>

我的计时器很好地减少了,但它没有显示在我的屏幕上

【问题讨论】:

    标签: android xamarin mvvmcross countdown


    【解决方案1】:

    问题在于,在您的 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用Task.Delay 来获得与 Timer 相同的效果。有关详细信息,请参阅此答案:PCL .NET 4.5 Timer

      【讨论】:

        猜你喜欢
        • 2016-04-24
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 2012-05-01
        相关资源
        最近更新 更多