Xamarin 计时器未更新
Posted
技术标签:
【中文标题】Xamarin 计时器未更新【英文标题】:Xamarin Timer not updating 【发布时间】:2022-01-04 01:07:56 【问题描述】:我正在制作一个健身应用,所以我需要一个计时器。我已经在代码隐藏中完成了这项工作:
public partial class Timer : ContentView
private int seconds = 30;
private System.Timers.Timer timer;
public Timer()
InitializeComponent();
timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.AutoReset = true;
timer.Elapsed += new System.Timers.ElapsedEventHandler(OneSecondPassed);
timer.Enabled = true;
private void OneSecondPassed(object source, System.Timers.ElapsedEventArgs e)
seconds--;
public string Time
get => seconds.ToString();
然后对于 UI,我制作了一个标签并将其 text 属性绑定到我的 Time 属性:
<Label BindingContext ="x:Reference this"
Text="Binding Time"/>
//"this" is a reference to my class
当我启动应用程序时,计时器仍然是 30。我知道“秒”肯定会减少,所以绑定肯定有问题。我知道我可以更新里面标签的 text 属性OneSecondPassed ,但我想了解有关数据绑定的更多信息。帮助?
【问题讨论】:
你需要实现INotifyPropertyChanged
。有数百个关于如何做到这一点的现有问题。您还需要更新您绑定的公共属性,而不是私有字段seconds
【参考方案1】:
正如 Jason 所说,实现INotifyPropertyChanged
接口是一个不错的选择。
为了您更好的理解,我写了一个符合您要求的可运行项目供您参考。
这里是 xaml 代码:
<StackLayout>
<Label Text="Binding DateTime"
FontSize="Large"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</StackLayout>
这是cs代码:
public partial class MainPage : ContentPage, INotifyPropertyChanged
int dateTime;
public event PropertyChangedEventHandler PropertyChanged;
public MainPage()
InitializeComponent();
this.DateTime = 30;
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
if (DateTime > 0)
DateTime--;
return true;
);
BindingContext = this;
public int DateTime
set
if (dateTime != value)
dateTime = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DateTime"));
get
return dateTime;
【讨论】:
我想是的……PropertyChanged 方法究竟通知了谁? 另外,如果 PropertyChanged 只是通知应用程序属性发生了变化,为什么我们需要做 PropertyChanged != null? INotifyPropertyChanged的使用请参考(docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/…)。对于INotifyPropertyChanged,它是一个事件,你可以有C#事件的相关信息。以上是关于Xamarin 计时器未更新的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Android RunOnUIThread 和 onTimedEvent 延迟/滞后(我正在尝试显示倒数计时器)