gpt4 book ai didi

android - 倒计时 MVVMCross 与 Xamarin Android

转载 作者:行者123 更新时间:2023-11-29 15:43:38 24 4
gpt4 key购买 nike

我想在我的 MVVMCross 机器人项目中为我的 TextView 创建一个倒数计时器。

这是我的解决方案: enter image description here

这个解决方案有点问题,因为我不能使用 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 中的 View 模型:

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

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

最佳答案

问题在于,在您的 ViewModel 中,您永远不会对计时器的变化使用react,也永远不会调用 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);
}
}

关于android - 倒计时 MVVMCross 与 Xamarin Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36468734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com