让我说我有2个Windows( loginWindow 和 MainWindow )。当某个时间用完(比如说30秒)时,我希望我的程序再次自动登录(打开 loginWindow )。我尝试编写一个全局秒表,可以在程序中从任何位置重置该秒表,以便在时间用完后可以打开 loginWindow 。 这就是我得到的:(也是WPF的新手)
public static Stopwatch stopwatch = new Stopwatch();
public static long timeSpan;
public static void startStopwatch()
{
stopwatch.Start();
Thread.Sleep(10000);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
timeSpan = stopwatch.ElapsedMilliseconds / 1000;
}
public static void restartStopwatch()
{
stopwatch.Stop();
startStopwatch();
}
public Page1()
{
InitializeComponent();
GlobalClass.startStopwatch();
if(GlobalClass.timeSpan == 10)
{
MessageBox.Show("Stopwatch reached end"); //also jump back to loginWindow
}
}
所以这行不通,但我不知道为什么。我的问题是:在我更深入地了解秒表之前,应该先使用秒表解决此问题,还是使用其他方式实现我想要的。也是为什么这不起作用:(。
感谢Advance <3
答案 0 :(得分:1)
您可以将计时器实现为Singelton,并将导航处理程序(或您的导航概念)注册到TickEvent。 设置的时间到期后,将触发该事件,您可以返回登录屏幕。
您现在可以从其他位置开始/停止/重置。
public class GlobalTimer : Timer
{
private GlobalTimer instance;
public GlobalTimer Instance => instance ?? (instance = new GlobalTimer());
private GlobalTimer()
{
}
}
编辑: 顾名思义,秒表是一种测量时间跨度的类。 您想要的只是一个闹钟,它会在特定时间过去时通知您。
您的程序无法正常工作,因为您正在等待UI的创建。这意味着尚未绘制UI,并且您告诉线程正在绘制
等待10秒钟,然后再次绘制上一个。因此,不会显示Page1。
因此,切勿在UI线程中使用Thread.wait(x)
(当线程不工作(休眠)时,UI会冻结)。
这里是计时器类的链接,以了解计时器的工作方式的更多信息:https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx
编辑2: 正如Clemens所说,DispatcherTimer是UI应用程序的更好选择,因为事件是通过UI线程处理的。 如果要使用“标准”计时器,则可能必须使用调度程序来调用UI元素(变量/ Methoen /等)。 否则,数据将在不起作用的不同线程中进行管理。
在此处查看答案/更多信息:WPF - Threads and change variable