首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UWP导航页面计时器

UWP导航页面计时器
EN

Stack Overflow用户
提问于 2018-02-21 21:02:45
回答 2查看 270关注 0票数 1

我的页面导航有问题,当我切换页面,回到我的MainPage时,我的计时器NiveauTimer不工作(我的TextBox中什么也没有出现),但是计时器DispatcherTimer工作得很好。

代码语言:javascript
复制
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)
        {

        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-02-21 23:55:53

问题是,当您从一个页面导航并返回该页面时,会创建该页面的一个新实例。现有的页面实例保留在内存中(因为有计时器),但您实际看到的页面是该页面的新实例,它会创建自己的计时器。

一种解决方案是将NavigationCacheMode="Required"设置为您的页面,这样当您从它导航到页面时,它将重用现有的实例。

您还可以将计时器变量设置为static,并只创建它们的一个实例。

这就产生了最好的解决方案--使用一个包含计时器和其他数据的ViewModel类,并将导航堆栈上页面的ViewModels保存在内存中。一个MVVM框架可以提供很多帮助,我建议使用MvvmLight,Prism或者MvvmCross --所有这些都可以为你处理这个逻辑。

票数 2
EN

Stack Overflow用户

发布于 2018-02-25 08:56:14

您应该覆盖Page上的OnNavigatedToOnNavigatedFrom方法,而不是在构造函数中设置计时器。这样,您可以在离开页面时删除计时器,并在返回时重新设置计时器。

代码语言:javascript
复制
protected override void OnNavigatedTo(NavigationEventArgs e)
{
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48906637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档