C# UWP导航页面计时器
我的页面导航有问题,当我更改页面并返回主页时,我的计时器C# UWP导航页面计时器,c#,uwp,uwp-xaml,C#,Uwp,Uwp Xaml,我的页面导航有问题,当我更改页面并返回主页时,我的计时器NiveauTimer不工作(我的文本框中没有显示任何内容),但计时器dispatchermer工作正常 namespace BassinExpertV1 { public sealed partial class MainPage : Page { PCF8591 ADConverter; DispatcherTimer dispatcherTimer; Dispatcher
NiveauTimer
不工作(我的文本框中没有显示任何内容),但计时器dispatchermer
工作正常
namespace BassinExpertV1
{
public sealed partial class MainPage : Page
{
PCF8591 ADConverter;
DispatcherTimer dispatcherTimer;
DispatcherTimer NiveauTimer;
public MainPage()
{
//Create Timer Date
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
//Create Timer water level
NiveauTimer = new DispatcherTimer();
NiveauTimer.Tick += NiveauTimer_Tick;
NiveauTimer.Interval = new TimeSpan(0, 0, 1);
this.InitializeComponent();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
dispatcherTimer.Start(); //Timer Date
NiveauTimer.Start(); //Timer water level
}
//----------------------------------------------------------------------------
// Timer Date
//----------------------------------------------------------------------------
private void DispatcherTimer_Tick(object sender, object e)
{
DateHeure.Text = DateTime.Now.ToString();
}
//----------------------------------------------------------------------------
// Timer WaterLevel
//----------------------------------------------------------------------------
private async void NiveauTimer_Tick(object sender, object e)
{
RecupNiveauAsync();
await System.Threading.Tasks.Task.Delay(2000); //wait for 2 seconds (= 2000ms)
try
{
double value = ADConverter.ReadI2CAnalog_AsDouble(PCF8591_AnalogPin.A0) *5 + 95; // Conversion du la valeur du potentiomètre
value = Math.Round(value, 2, MidpointRounding.AwayFromZero); //Arrondir la valeur
TextBoxNiveau.Text = Convert.ToString(value) + " %"; // Afficher dans la Textbox la valeur du potentiomètre en %
}
catch
{
MessageDialog msg = new MessageDialog("Probleme");
await msg.ShowAsync();
}
}
//----------------------------------------------------------------------------
// Water Level conversion //----------------------------------------------------------------------------
private async System.Threading.Tasks.Task RecupNiveauAsync()
{
ADConverter = await PCF8591.Create();
}
//----------------------------------------------------------------------------
// Bouton automatique
//----------------------------------------------------------------------------
private void Automatique_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(Automatique), null); //navigation vers la page automatique
}
//----------------------------------------------------------------------------
// Bouton manuel
//----------------------------------------------------------------------------
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(Manuel)); //navigation vers la page manuel
}
private void TextBlock_SelectionChanged(object sender, RoutedEventArgs e)
{
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
}
}
}
问题是,当您从一个页面导航并返回到该页面时,会创建该页面的一个新实例。现有页面实例保留在内存中(因为计时器),但您实际看到的页面是页面的新实例,它创建自己的计时器 一种解决方案是将
NavigationCacheMode=“Required”
设置到您的页面,这样当您从它和页面进行导航时,它将重用现有实例
您还可以将计时器变量设置为静态
,并仅创建它们的单个实例
这导致了最佳解决方案-使用
ViewModel
类,该类将包含计时器和其他数据,并将导航堆栈上的页面的ViewModels
保留在内存中。MVVM框架会有很大帮助,我建议使用MvvmLight、Prism或MvvmCross-所有这些都将为您处理此逻辑。您应该重写构造函数中的OnNavigatedTo
和OnNavigatedFrom
方法,而不是在构造函数中设置计时器。这样,当您离开页面时可以删除计时器,当您返回页面时可以重新设置计时器
protected override void OnNavigatedTo(NavigationEventArgs e)
{