【问题标题】:How can I update a line in a C# Windows Console App while without disrupting user input?如何在不中断用户输入的情况下更新 C# Windows 控制台应用程序中的一行?
【发布时间】:2010-10-11 20:30:53
【问题描述】:

在使用 C# 构建 Windows 控制台应用程序时,是否可以在用户输入文本时更新控制台中的行?

我当前的代码是:

    public static void Scope()
    {
        bool stop = false;
        ASCOM.Utilities.Chooser chooser = new ASCOM.Utilities.Chooser {DeviceType = "Telescope"};
        ASCOM.Interface.ITelescope scope = new ASCOM.DriverAccess.Telescope(chooser.Choose());
        scope.Connected = true;
        ThreadPool.QueueUserWorkItem(
            cb =>
            {
                do
                {
                    Console.WriteLine("RA:     " + scope.RightAscension);
                    Console.WriteLine("Dec:    " + scope.Declination);
                    Console.WriteLine("Status: " + scope.Slewing);
                    Console.SetCursorPosition(0, Console.CursorTop - 3);
                    Thread.Sleep(1000);
                } while (!stop);
            }
        );
        Console.Read();
        stop = true;
    }

【问题讨论】:

标签: c# console readline


【解决方案1】:

我建议将其从控制台应用程序更改为 Windows 应用程序,并将报告放入标准 GUI。

这将使您的屏幕上的用户输入区域与您的报告区分开来,并提供一个整体上更好、更实用的界面。


话虽如此,您可能会显式定位光标,并避免“打断”用户(比您的刷新方法调用更长)。不过,这需要付出很多努力。

关键是逐个键读取控制台输入(而不是使用 ReadLine),因为您需要能够“重新键入”用户之前的输入。

当需要刷新显示时,您可以获得当前行的当前光标位置和内容,清除控制台,写入新文本,写入任何已经显示的文本(用户当前输入) , 并使用Console.SetCursorPosition 显式设置光标位置。

如果您要这样做,最好先将光标位置设置到控制台的最后一行(实际上是制作控制台模式 gui)。这样您至少可以提供老式控制台应用程序的效果,并让用户不那么惊讶。

【讨论】:

  • 这是个好主意,但我想看看是否可行。
  • 老式绿屏的特性之一是它们的荧光粉具有很长的持久性。在像素被照亮后它会发光一段时间,当您开始四处滑动光标时非常理想。这不是现代屏幕的工作方式,他们试图使其非常短,以便视频和动画可以很好地播放。换句话说,提议的解决方案将像廉价汽车旅馆一样闪烁。
  • @Hans:是的,它并不完美——你可以通过移动光标位置并一个一个地覆盖值来改进它,但与使用真正的 GUI 相比它仍然是垃圾。但是,如果您出于某种原因需要在控制台中运行它,它至少可以工作......
  • 需要注意的是用户输入了多少行。这可能会让您感到困惑,具体取决于您的操作方式。
  • 谢谢,您的帮助很大。我让它工作(没有任何闪烁)。我用 writeline 覆盖它。
猜你喜欢
  • 2022-01-12
  • 2010-10-24
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多