הוספת מחלקה סטטית
נוסיף מחלקה סטטית בשם SessionManager (כמובן ניתן לבחור שם שונה):
public static class SessionManager
{
private static DispatcherTimer _timer;
public static event Action OnTimeout; // אירוע שמופעל כשהזמן נגמר
public static void Initialize(int minutes)
{
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMinutes(minutes);
_timer.Tick += (s, e) => OnTimeout?.Invoke();
}
public static void Start() => _timer?.Start();
public static void Stop() => _timer?.Stop();
public static void Reset()
{
_timer?.Stop();
_timer?.Start();
}
}אתחול ב־App.xaml.cs
בקובץ App.xaml.cs:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 1. אתחול הטיימר (למשל ל־5 דקות)
SessionManager.Initialize(5);
SessionManager.OnTimeout += App_OnTimeout;
// 2. האזנה גלובלית לכל תנועת עכבר או לחיצת מקלדת באפליקציה
EventManager.RegisterClassHandler(typeof(Window), Window.PreviewMouseMoveEvent,
new MouseEventHandler(ResetInactivity));
EventManager.RegisterClassHandler(typeof(Window), Window.PreviewKeyDownEvent,
new KeyEventHandler(ResetInactivity));
}
private void ResetInactivity(object sender, EventArgs e)
{
SessionManager.Reset();
}טיפול בסיום הזמן
MainWindow הוא החלון שאליו יועבר המשתמש:
private void App_OnTimeout()
{
SessionManager.Stop(); // עצירת הטיימר כדי שלא יקפוץ שוב ושוב
// פתיחת חלון לוגין
var loginWindow = new MainWindow();
loginWindow.Show();
// סגירת כל שאר החלונות הפתוחים (כולל ה־MainWindow)
foreach (Window win in Application.Current.Windows)
{
if (win != loginWindow)
{
win.Close();
}
}
MessageBox.Show("עקב חוסר פעילות, המערכת תועבר למסך ההתחברות.");
}הפעלת הטיימר לאחר כניסת המשתמש
נפעיל את הטיימר רק בעת כניסת המשתמש - התחברות / הרשמה. לדוגמה:
private async void Login_Click(object sender, RoutedEventArgs e)
{
string mail = txtMail.Text;
string password = txtPassword.Password;
if (await UserAPIService.SignIn(mail, password) == true)
{
SessionManager.Start(); // התחלת הספירה רק עכשיו
this.NavigationService.Navigate(new Introduction());
}
else
{
MessageBox.Show("ההתחברות נכשלה");
}
}