2017-02-04 2 views
2

Мои требования: нужен таймер сеанса для каждой страницы (кроме страницы входа). Если таймер превысил 60 секунд без каких-либо действий пользователя, он должен перенаправить на страницу входа.Windows Phone - Application Level DispatcherTimer

Я успешно выполнил вышеуказанное требование для одной страницы с нижеприведенными фрагментами кода.

 DispatcherTimer dispatcherTimer; 
     DateTimeOffset startTime; 
     DateTimeOffset lastTime; 
     DateTimeOffset stopTime; 
     int timesTicked = 1; 
     int timesToTick = 60; 


     page_load() 
     { 
      dispatcherTimer = new DispatcherTimer(); 
      dispatcherTimer.Tick += dispatcherTimer_Tick; 
      dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
      startTime = DateTimeOffset.Now; 
      lastTime = startTime; 
      dispatcherTimer.Start();  
     } 


     private void PhoneApplicationPage_ManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e) 
     { 
      startTime = DateTimeOffset.Now; 
      lastTime = startTime; 
      dispatcherTimer.Start();  
     } 

     void dispatcherTimer_Tick(object sender, object e) 
     { 
      DateTimeOffset time = DateTimeOffset.Now; 
      TimeSpan span = time - lastTime; 
      lastTime = time; 
      timesTicked++; 
      if (timesTicked > timesToTick) 
      { 
       isTimeOver = true; 
       stopTime = time; 

       dispatcherTimer.Stop(); 

       span = stopTime - startTime; 
       MessageBox.Show("Login again", "Session Expired", MessageBoxButton.OK); 
       NavigationService.Navigate(new Uri("/Login_3.xaml", UriKind.Relative)); 
      } 
     } 

Мне нужна эта логика для каждой страницы. Поскольку страницы недоступны в пользовательских классах для навигации, я смущен. Я не думаю, что писать dispatcherTimer_Tick событие на каждой странице - хороший подход. Не могли бы вы кому-нибудь посоветовать, как мы можем это сделать в одном коде, который можно использовать для каждой страницы? Заранее спасибо :)

ответ

0

Вы можете создать общий базовый класс для каждой страницы, чтобы наследовать и написать этот код там.

Пример:

namespace Test 
{  
    public class PageBaseWithTimer: PhoneApplicationPage 
    { 
     DispatcherTimer dispatcherTimer; 

     ... //Copied from question 

     int timesToTick = 60; 

     PageBase() 
     { 
      this.Loaded += PageBase_Loaded; 
      this.OnManipulationCompleted += PhoneApplicationPage_ManipulationCompleted 
     } 

     private void PageBase_Loaded(object sender, RoutedEventArgs e) 
     { 
      dispatcherTimer = new DispatcherTimer(); 

      ... //Copied from question 

      dispatcherTimer.Start(); 
     } 

     private void PhoneApplicationPage_ManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e) 
     { 
      startTime = DateTimeOffset.Now; 
      lastTime = startTime; 
      dispatcherTimer.Start(); 
     }  

     void dispatcherTimer_Tick(object sender, object e) 
     { 
      DateTimeOffset time = DateTimeOffset.Now; 

      ... //Copied from question 

      MessageBox.Show("Login again", "Session Expired", MessageBoxButton.OK); 
      NavigationService.Navigate(new Uri("/Login_3.xaml", UriKind.Relative)); 
     } 

     protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs args) 
     { 
      //dispose timer 
      dispatcherTimer.Stop(); 
      dispatcherTime.Tick -= dispatcherTimer_Tick 
      dispatcherTimer = null; 
     } 
    } 
} 

Наследование выше класс на страницах, где требуется этот таймер. Не забудьте оставить таймер в базовом классе, если он не требуется, при навигации.

public partial class PageWithTimer1 : PageBaseWithTimer 
    { 
     public PageWithTimer1() 
     { 
      InitializeComponent(); 
     }   
    } 

    <c:PageBaseWithTimer xmlns:c="clr-namespace:Test" 
     x:Class="BBM.UI.Views.PageWithTimer1" 
     ... 

    </c:PageBaseWithTimer> 

Убедитесь, что вы даете модификатор доступа как public для базового класса - PageBaseWithTimer, чтобы сделать его доступным для всех страниц.

+0

Спасибо за ваш ответ. Я пробовал вот так, Но у меня есть ошибка, например, имя «PageBaseWithTimer» не существует в пространстве имен «clr-namespace: TEST» Не могли бы вы рассказать о втором фрагменте кода? – Ramin