繁体   English   中英

C#按钮暂停

[英]C# button pause

我正在C#的GUI中制作数字时钟。 我有5个按钮,其中4个用于时区转换,另外一个用于关闭表格。

我的问题是,当我按下按钮一(从我的系统时间转换为中部时间)时,它将在标签框中闪烁大约1秒钟的时间,并恢复为当前的系统时间。

在控制台中,我知道有一个暂停执行来暂停程序。 如何使用暂停将中央时间按钮保持在该设置上而又保持计时器运行? 我愿意使用多种形式。

这是我的按钮代码:

private void Central_Click(object sender, EventArgs e)
{
    hr = DateTime.Now.Hour;
    hr = DateTime.Now.Hour - 1;
    min = DateTime.Now.Minute;
    sec = DateTime.Now.Second;

    if (hr > 12)
        hr -= 12;

    if (sec % 2 == 0)
    {
        time.Text = hr + ":" + min + ":" + sec;
    }
    else
    {
        time.Text = hr + " " + min + " " + sec;
    }
}

如果我正确理解,也许这样的事情对您有用:

private void Central_Click(object sender, EventArgs e)
{
    // Here you could disable all the buttons

    // endTime defines how long we will show this time zone (5 seconds)
    var endTime = DateTime.Now.Add(TimeSpan.FromSeconds(5));

    while (DateTime.Now < endTime)
    {
        // Show the short time format (hh:mm:ss AM|PM)
        var displayText = DateTime.Now.Subtract(TimeSpan.FromHours(1)).ToString("T");

        if ((DateTime.Now.Second % 2 == 1))
        {
            // Every other second, hide the colons
            displayText = displayText.Replace(":", " ");
        }

        time.Text = displayText;

        // Sleep for one second
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }

    // And here you can enable the buttons again
}

要注意的另一件事是,存在用于转换到另一个时区的内置方法。 基本上,您将获得UTC(通用)时间,然后将其转换为您感兴趣的时区。上面的代码可以转换为如下所示:

private void Central_Click(object sender, EventArgs e)
{
    // endTime defines how long we will show this time zone (5 seconds)
    var endTime = DateTime.Now.Add(TimeSpan.FromSeconds(5));

    while (DateTime.Now < endTime)
    {
        // Get UTC time
        DateTime utcTime = DateTime.UtcNow;

        // Convert it to Central Time
        var displayText = TimeZoneInfo.ConvertTimeFromUtc(utcTime, 
            TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"))
            .ToString("T");

        if ((DateTime.Now.Second % 2 == 1))
        {
            // Every other second, hide the colons
            displayText = displayText.Replace(":", " ");
        }

        time.Text = displayText;

        // Sleep for one second
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
}

您的问题还不清楚。 但是我想你只是在做一个普通的时钟 为此,您要做的就是使时区设置保持不变 因此,您需要它们存储在一个或两个类级别的变量中,也许像这样:

TimeSpan correction = new TimeSpan(0);
string zone = "ET";

private void timer1_Tick(object sender, EventArgs e)
{
    // display the corrected time with its name
    time.Text = (DateTime.Now + correction).ToString("h:mm:ss ") + zone;
}

private void Central_Click(object sender, EventArgs e)
{
    correction = new TimeSpan(-1, 0, 0);  // set the hours of the new zone
    zone = "CT";                         // set its name
}

我希望您对Timer拥有一个更好的名称,就像您使用的其他名称一样。(尽管我总是包括一个向我显示控件类型的前缀。)

还请查看预定义的日期和时间格式的内容,其中许多将根据您的计算机本地化工作:

标准日期和时间模式

长时间模式

如果我不明白您所说的“暂停”是什么意思,请澄清一下! 如果也许您不想真正切换到新时区,而只显示一小段时间,则只需添加3或4行即可。.:

一个新的变量来保留该区域的时间:

int secondsToHold = 0;

单击一行将其设置为几秒钟,在这里我说了3秒:

secondsToHold = (int) (3 *  1000f /timer1.Interval);

最后,在Tick事件中编写代码以检查并重置变量:

if (secondsToHold > 0) secondsToHold -= 1;
else { correction = new TimeSpan(0); zone = "ET"; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM