4

我想写一个简单的秒表程序,我可以用下面的代码让它工作

    public Form1()
    {
        InitializeComponent();
    }
    System.Diagnostics.Stopwatch ss = new System.Diagnostics.Stopwatch { };
    private void button1_Click(object sender, EventArgs e)
    {
        if (button1.Text == "Start")
        {
            button1.Text = "Stop";

            ss.Start();
            timer1.Enabled = true;

        }
        else
        {
            button1.Text = "Start";

            ss.Stop();
            timer1.Enabled = false;

        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {


            int hrs = ss.Elapsed.Hours, mins = ss.Elapsed.Minutes, secs = ss.Elapsed.Seconds;
            label1.Text = hrs + ":";
            if (mins < 10)
                label1.Text += "0" + mins + ":";
            else
                label1.Text += mins + ":";
            if (secs < 10)
                label1.Text += "0" + secs;
            else
                label1.Text += secs;


    }

    private void button2_Click(object sender, EventArgs e)
    {
        ss.Reset();
       button1.Text= "Start";
       timer1.Enabled = true;

    }

现在我想为这个秒表设置一个自定义的开始时间,例如我希望它不是从 0:00:00 开始计数,而是从 0:45:00 开始我该怎么做,谢谢。

4

5 回答 5

19

秒表没有任何允许您设置自定义开始时间的方法或属性。

您可以继承 Stopwatch 并覆盖 ElapsedMilliseconds 和 ElapsedTicks 以调整您的开始时间偏移量。

    public class MyStopwatch : Stopwatch
    {
        public TimeSpan StartOffset { get; private set; }

        public MyStopwatch(TimeSpan startOffset)
        {
            StartOffset = startOffset;
        }

        public new long ElapsedMilliseconds
        {
            get
            {
                return base.ElapsedMilliseconds + (long)StartOffset.TotalMilliseconds;
            }
        }

        public new long ElapsedTicks
        {
            get
            {
                return base.ElapsedTicks + StartOffset.Ticks;
            }
        }
    }
于 2012-07-27T04:38:21.103 回答
6

根据您的示例,创建一个初始值为 45 分钟的System.TimeSpan的新实例。比将秒表的值添加到TimeSpan.Add 方法。方便的是, Stopwatch.Elapsed已经是 System.TimeSpan 类型。

比使用字符串格式化程序将格式化的时间打印到标签中。我认为其他答案之一已经显示了如何做到这一点。否则,这里有一些关于如何格式化 TimeSpan 实例TimeSpan.ToString 方法(字符串)或使用自定义格式化程序的很好的参考资料。

var offsetTimeSpan = new System.TimeSpan(0,45,0).Add(ss.Elapsed)
于 2012-07-27T04:49:04.257 回答
1
  • 额外的 SetOffset() 方法
  • 带有偏移量的额外初始化;
  • 覆盖所有需要的方法
  • 具有相同的类名,因此无需更改您的项目代码

.

using System;

public class Stopwatch : System.Diagnostics.Stopwatch
{
    TimeSpan _offset = new TimeSpan();

    public Stopwatch()
    {
    }

    public Stopwatch(TimeSpan offset)
    {
        _offset = offset;
    }

    public void SetOffset(TimeSpan offsetElapsedTimeSpan)
    {
        _offset = offsetElapsedTimeSpan;
    }

    public TimeSpan Elapsed
    {
        get{ return base.Elapsed + _offset; }
        set{ _offset = value; }
    }

    public long ElapsedMilliseconds
    {
        get { return base.ElapsedMilliseconds + _offset.Milliseconds; }
    }

    public long ElapsedTicks
    {
        get { return base.ElapsedTicks + _offset.Ticks; }
    }
}
于 2017-02-26T09:17:05.903 回答
0

您无法更改开始时间,但您可以在 Stop() 之后修改它,没有人更聪明。

快速谷歌搜索: http: //msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.start (v=vs.90).aspx

一个小的修改:

class Program
{
    static void Main(string[] args)
    {            
        System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
        
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;
        
        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes + 45 , ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

结果:

运行时间 00:45:10.00

按任意键继续 。. .

作为开发人员,对您进行更多研究将对您有不可估量的帮助。

于 2012-07-27T04:42:43.183 回答
0

偏移量是固定的还是可变的?

在任何一种情况下,都将它作为类的一些成员变量或 const 并添加它。

private TimeSpan offset = TimeSpan.FromSeconds(45);

然后只需更改您的刻度以包含它:

var combined = ss.Elapsed + offset;
int hrs = combined.Hours, mins = combined.Minutes, secs = combined.Seconds;
于 2012-07-27T05:16:42.190 回答