C#按钮暂停
本文关键字:暂停 按钮 | 更新日期: 2023-09-27 18:28:45
我正在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;
在一行点击将其设置为几秒钟,这里我cose 3秒钟:
secondsToHold = (int) (3 * 1000f /timer1.Interval);
最后在Tick事件中编码以检查和重置可变值:
if (secondsToHold > 0) secondsToHold -= 1;
else { correction = new TimeSpan(0); zone = "ET"; }