全球秒表WPF-这如何/为什么不起作用

时间:2018-07-17 08:44:16

标签: c# wpf mvvm stopwatch

让我说我有2个Windows( loginWindow MainWindow )。当某个时间用完(比如说30秒)时,我希望我的程序再次自动登录(打开 loginWindow )。我尝试编写一个全局秒表,可以在程序中从任何位置重置该秒表,以便在时间用完后可以打开 loginWindow 。 这就是我得到的:(也是WPF的新手)

GlobalClass:

  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();
    }

Page1(MainWindow):

     public Page1()
    {
        InitializeComponent();
        GlobalClass.startStopwatch();
        if(GlobalClass.timeSpan == 10)
        {
            MessageBox.Show("Stopwatch reached end"); //also jump back to loginWindow
        }

    }

所以这行不通,但我不知道为什么。我的问题是:在我更深入地了解秒表之前,应该先使用秒表解决此问题,还是使用其他方式实现我想要的。也是为什么这不起作用:(。

感谢Advance <3

1 个答案:

答案 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