c# - Xamarin.Forms C# 属性未在 Device.StartTimer 中更新
问题描述
我想创建一个对选定时间进行倒计时的应用程序。但我有一个奇怪的问题,我不知道我做错了什么。
这是我的计时器,每次选择器的属性更改时都会调用它。当我选择一个时间时,代码仅删除 1 秒,然后不再更新。
Picker.PropertyChanged += (sender, e) =>
{
if (e.PropertyName == TimePicker.TimeProperty.PropertyName)
{
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
{
clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
return true;
});
}
};
我还尝试打印一个在值中不断更新的值:
public int i = 0;
private void StartTimer()
{
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
{
clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
label.Text = i;
i++;
return true;
});
}
价值不断增加,所以我确定它正在做某事。
这是我的模型视图:
public class ClockViewModel : BaseViewModel
{
private TimeSpan selectedTime;
public TimeSpan SelectedTime
{
get => selectedTime;
set
{
selectedTime = value;
NotifyPropertyChanged();
}
}
}
有人知道我在这里做错了什么吗?
解决方案
计时器在不同的线程中运行。如果你想在 UI 所在的主线程上运行某些东西,那么你必须使用该Device.BeginInvokeOnMainThread()
方法。像这样:
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
{
Device.BeginInvokeOnMainThread (() =>
{
clockViewModel.SelectedTime = Picker.Time.Subtract(TimeSpan.FromSeconds(1));
label.Text = i;
});
i++;
return true;
});
推荐阅读
- c++ - 如何解决我在 Visual Studio 中的持续错误?
- javascript - 覆盖 Quill.js 优化过程以启用分别具有两个连续标签(未连接)
- ruby-on-rails - AXLSX Gem:列的单元格样式组
- c - 启动气体 x86 n 得到段错误?
- excel - 遍历表并使用每行中的多个值
- django - 货币符号在 Saleor 平台上未正确显示
- amazon-web-services - 授权:不记名令牌与 AWS 的令牌授权方相同吗?
- amazon-web-services - 如何通过 aws WAF 阻止特定 IP 的网站
- react-native - EPERM:不允许操作
- powershell - Powershell 显示端口连接并仅过滤关闭的端口