首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#按钮暂停

C#按钮暂停
EN

Stack Overflow用户
提问于 2014-11-01 11:33:27
回答 2查看 403关注 0票数 1

我在C#的图形用户界面中制作了一个数字时钟。我有5个按钮,4个用于时区转换,一个用于关闭表单。

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

在控制台中,我知道有一个暂停执行来暂停程序。如何使用暂停来按住该设置的中心时间按钮,同时保持计时器运行?我对使用多种表单持开放态度。

下面是我的按钮代码:

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-11-01 12:21:49

如果我理解正确的话,也许这样的东西对你来说是有效的:

代码语言:javascript
复制
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 (通用)时间,然后将其转换为您感兴趣的时区。上面的代码可以转换成这样使用:

代码语言:javascript
复制
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));
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-11-01 16:30:45

你的问题很不清楚。但我猜你只是在做一个常规时钟。为此,您需要做的就是使时区设置持久化。因此,您需要在一个或两个类级别变量中对它们进行存储,可能如下所示:

代码语言:javascript
复制
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
}

我希望你对计时器有一个更好的名字,就像你使用的其他名字一样。(尽管我总是包含一个前缀来显示控件的类型。)

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

Standard Date&Time patterns

Long time pattern

如果我不明白你说的“暂停”是什么意思,请澄清一下!如果你不想真正切换到一个新的时区,而只想短时间地显示它的时间,你只需要添加3到4行:

一个新的变量用来保存时间来保存区域:

代码语言:javascript
复制
int secondsToHold = 0;

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

代码语言:javascript
复制
secondsToHold = (int) (3 *  1000f /timer1.Interval);

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

代码语言:javascript
复制
if (secondsToHold > 0) secondsToHold -= 1;
else { correction = new TimeSpan(0); zone = "ET"; }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26685975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档