全局秒表 WPF - how/why 这不起作用吗

Global Stopwatch WPF - how/why is this not working

假设我有 2 个 Windows(loginWindowMainWindow)。当某个时间用完(比如说 30 秒)时,我希望我的程序再次自动记录( open loginWindow )。我尝试编写一个全局秒表,我可以在我的 Programm 中从任何地方重置它,这样我就可以在时间用完后打开 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();
    }

第 1 页(主窗口):

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

    }

所以这不起作用,但我不知道为什么。我的问题是:在我深入研究秒表之前,我应该用秒表解决这个问题还是使用不同的方式来实现我想要的。还有为什么这不起作用:(.

提前致谢 <3

您可以将计时器实现为 Singelton,并将导航处理程序(或您的导航概念)注册到 TickEvent。 当您设置的时间到期时触发该事件,您可以return进入登录屏幕。

您现在可以从不同的位置start/stop/reset。

public class GlobalTimer : Timer
{
    private GlobalTimer instance;

    public GlobalTimer Instance => instance ?? (instance = new GlobalTimer());

    private GlobalTimer()
    {
    }
}

编辑: 秒表,顾名思义,是一个 class 来测量时间跨度。 你想要的更多的是一个闹钟,它会在特定时间过去时通知你。

您的程序无法运行,因为您正在等待 UI 创建。这意味着 UI 还没有绘制,你告诉线程谁在绘制 等待 10 秒,然后再次绘制前一个。因此不显示 Page1。 因此,永远不要在 UI 线程中 Thread.wait(x)(当线程不工作(休眠)时,您的 UI 会冻结)。

这里是定时器的 Link Class 以了解定时器如何工作的更多信息:https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

编辑 2: 正如 Clemens 所说,DispatcherTimer 是 UI 应用程序的更好选择,因为事件是使用 UI 线程处理的。 如果你想使用 "normal" 计时器,你可能必须使用调度程序调用 UI 元素(variables/Methoen/etc。)。 否则数据将在不同的线程中管理,这是行不通的。

在此处查看 answer/more 信息:WPF - Threads and change variable