7

我有一个控制台应用程序,我想创建一个倒数计时器。这是我尝试过的:

    static void Main(string[] args)
    {
        for (int a = 10; a >= 0; a--)
        {
            Console.Write("Generating Preview in {0}", a);
            System.Threading.Thread.Sleep(1000);
            Console.Clear();
        }
    }

此代码在某些情况下有效。但是,问题是它会清除整个控制台窗口,并且在计时器上方有一些字符时无法使用。

4

4 回答 4

13

如果您打印 "\r"到控制台,光标会回到当前行的开头,所以这有效:

for (int a = 10; a >= 0; a--)
{
    Console.Write("\rGenerating Preview in {0:00}", a);
    System.Threading.Thread.Sleep(1000);
} 
于 2013-08-01T21:29:56.300 回答
9

我知道有两种方法可以做你想做的事

1)使用Console.SetCursorPosition();。当您确定将超过计时器的字符数量时,这是适用的。

2)使用Console.CursorLeft。这适用于所有情况。

代码示例

static void Main(string[] args)
{
   for (int a = 10; a >= 0; a--)
   {
      Console.SetCursorPosition(0,2);
      Console.Write("Generating Preview in {0} ", a);  // Override complete previous contents
      System.Threading.Thread.Sleep(1000);
   }
}

static void Main(string[] args)
{
   Console.Write("Generating Preview in ");
   for (int a = 10; a >= 0; a--)
   {
      Console.CursorLeft = 22;
      Console.Write("{0} ", a );    // Add space to make sure to override previous contents
      System.Threading.Thread.Sleep(1000);
   }
}
于 2013-08-01T21:32:01.173 回答
2

您可以使用的一个简单技巧是\r在字符串中放置 a 以将光标返回到当前行的开头:

static void Main(string[] args)
{
    Console.WriteLine("This text stays here");
    for (int a = 10; a >= 0; a--)
    {
        Console.Write("\rGenerating Preview in {0}", a);
        System.Threading.Thread.Sleep(1000);
    }
}
于 2013-08-01T21:31:28.910 回答
1

Console.SetCursorPosition和相关是您可能正在寻找的。获取当前位置并将其重新设置回 aster 每次Write/WriteLine调用。

就像是:

var origRow = Console.CursorTop;
for (int a = 10; a >= 0; a--)
{
    Console.SetCursorPosition(0, origRow);
    Console.Write("Generating Preview in {0}", a);
    System.Threading.Thread.Sleep(1000);
}
Console.SetCursorPosition(0, origRow);
Console.Write("Generating Preview done.....");
于 2013-08-01T21:29:42.143 回答