计时器启动不允许在 Xamarin 窗体中使用 Navigate.Push 时加载我的其他页面



我使用System.Timers.Timer();代码在页面加载时执行倒计时计时器,然后我使用Navigate.Push进入另一个页面。

页面加载时的计时器代码:

public Index()
{
InitializeComponent();
StartCountDownTimer();
}
DateTime endTime = new DateTime(2019, 08, 25, 14, 00, 0);
public void StartCountDownTimer()
{
try
{
timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += t_Tick;
TimeSpan ts = endTime - DateTime.Now;        
lblCountDown.Text = ts.ToString("d' Days 'h' Hours 'm' Minutes 's' Seconds'");
timer.Start();
}
catch (Exception ex)
{
string Error = ex.Message;
}
}

System.Timers.Timer timer;
void t_Tick(object sender, EventArgs e)
{
try
{
TimeSpan ts = endTime - DateTime.Now;
string NewTimer = ts.ToString("d' Days 'h' Hours 'm' Minutes 's' Seconds'");
//txtCountDown.Text = NewTimer;
lblCountDown.Text = NewTimer;
if ((ts.TotalMilliseconds < 0) || (ts.TotalMilliseconds < 1000))
{
timer.Stop();
lblCountDown.Text = "The day has arrived";
}
}
catch (Exception ex)
{
string Error = ex.Message;
}
}

使用同一页面上的按钮单击来导航代码:

private void ClickAboutTab(object sender, EventArgs e)
{
await Navigation.PushAsync(new Page());
}

我正在导航到的页面代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="AppName.Pages.Page">
<ContentPage.Content>
<StackLayout>
<Label Text="Welcome to Xamarin.Forms!"
VerticalOptions="CenterAndExpand" 
HorizontalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage.Content>
</ContentPage>

我在导航之前已经尝试过的解决方案是:

timer.Stop();
timer.Dispose();
timer = null;

计时器回调不会从 UI 线程调用。

您需要从 ui 线程调用所有与 ui 相关的东西:

void t_Tick(object sender, EventArgs e)
{
try
{
TimeSpan ts = endTime - DateTime.Now;
string countDownValue = ts.ToString("'d' Days 'h' Hours 'm' Minutes 's' Seconds");
if ((ts.TotalMilliseconds < 0) || (ts.TotalMilliseconds < 1000))
{
timer.Stop();
countDownValue = "The day has arrived";
}
Device.BeginInvokeOnMainThread(async () =>
{
lblCountDown.Text = countDownValue;
}
}
catch (Exception ex)
{
string Error = ex.Message;
}
}

最新更新