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 更新标签被更改为不同的活动而被杀死

Xamarin 计时器崩溃

在 Xamarin 轮播页面中放置一个计时器

将计时器添加到Xamarin应用程序(c#)

Xamarin.Forms 中的计时器

Xamarin.Android RunOnUIThread 和 onTimedEvent 延迟/滞后(我正在尝试显示倒数计时器)