我正在制作一个基本的控制台应用程序(不幸的是,这是必须的),该应用程序显示了时间以及一个非常基本的界面,用户可以在其中输入选项。完成后,UI会更新以显示相关的新数据,并允许进一步的输入等。始终在顶部显示带有秒的实时时钟。
我基本上要做的是每秒重新绘制整个UI,并尝试听用户输入以指导下次如何绘制UI。重绘UI时如何管理用户输入?有更好的方法吗?
这是整个程序(非常缩减版本):
using System;
using System.Diagnostics;
using System.Timers;
namespace TimerTest
{
class Program
{
static bool useStartUI = false;
static string currentInput = "";
static Timer aTimer = new System.Timers.Timer();
static void Main(string[] args)
{
aTimer.Elapsed += new ElapsedEventHandler(DrawUI);
aTimer.Interval = 1000;
aTimer.Enabled = true;
Console.ReadLine();
currentInput = Console.ReadLine();
}
static void DrawUI(object source, ElapsedEventArgs e)
{
Debug.WriteLine("currentInput = " + currentInput);
if (currentInput == "A")
{
useStartUI = true;
} else
{
useStartUI = false;
}
if (!useStartUI)
{
DisplayStartUI();
}
else
{
DisplayCurrentUI();
}
}
private static void DisplayStartUI()
{
Console.Clear();
Console.WriteLine("DisplayStartUI - " + DateTime.Now.ToString("HH:mm:ss tt"));
Console.WriteLine("Press 'B' to switch to CurrentUI");
Console.ReadLine();
currentInput = Console.ReadLine();
}
private static void DisplayCurrentUI()
{
Console.Clear();
Console.WriteLine("DisplayCurrentUI - " + DateTime.Now.ToString("HH:mm:ss tt"));
Console.WriteLine("Press 'A' to switch to StartUI");
Console.ReadLine();
currentInput = Console.ReadLine();
}
}
}
此刻我在定时器启动后立即拥有Console.ReadLine();
,如果没有激活,则应用程序立即打开和关闭。其他两个Console.ReadLine();
被完全忽略,但正是在这些时候,我希望记录用户输入。
答案 0 :(得分:0)
似乎我在想这个问题,@ elgonzo为我指明了正确的方向。现在,我只在一行上显示计时器,并在需要时清除其他行。我有一个基本的工作示例,将把我的主程序扩展到其中。它似乎完全符合我的要求(显然缺少验证和功能),请对此进行评论,如果可以在以下方面进行改进:
using System;
using System.Diagnostics;
using System.Timers;
namespace TimerTest
{
class Program
{
static bool appOpen = true;
static bool useStartUI = false;
static string currentInput = "";
static Timer aTimer = new System.Timers.Timer();
static void Main(string[] args)
{
Console.WriteLine("Main - " + DateTime.Now.ToString("HH:mm:ss tt"));
aTimer.Elapsed += new ElapsedEventHandler(DrawClock);
aTimer.Interval = 1000;
aTimer.Enabled = true;
while (appOpen) // to keep the application running and give a possible exit - will expand this
{
DrawUI();
}
}
#region UI region
static void DrawClock(object source, ElapsedEventArgs e)
{
Console.SetCursorPosition(0, 0);
Console.WriteLine("DrawClock - " + DateTime.Now.ToString("HH:mm:ss tt"));
Console.SetCursorPosition(0, 7);
}
static void DrawUI()
{
Debug.WriteLine("currentInput = " + currentInput);
if (currentInput == "A" || currentInput == "a")
{
useStartUI = true;
}
else if (currentInput == "B" || currentInput == "b")
{
useStartUI = false;
}
if (useStartUI)
{
DisplayStartUI();
}
else
{
DisplayCurrentUI();
}
}
private static void DisplayStartUI()
{
CleanUI();
Console.WriteLine("DisplayStartUI");
Console.WriteLine("Press 'B' to switch to CurrentUI");
ConsoleKeyInfo keyPressed = Console.ReadKey();
Console.SetCursorPosition(0, 7);
Console.WriteLine("You pressed {0}", keyPressed.KeyChar);
currentInput = keyPressed.KeyChar.ToString();
if (keyPressed.KeyChar.ToString() == "b")
{
DrawUI();
}
}
private static void DisplayCurrentUI()
{
CleanUI();
Console.WriteLine("DisplayCurrentUI");
Console.WriteLine("Press 'A' to switch to StartUI");
ConsoleKeyInfo keyPressed = Console.ReadKey();
Console.SetCursorPosition(0, 7);
Console.WriteLine("You pressed {0}", keyPressed.KeyChar);
currentInput = keyPressed.KeyChar.ToString();
if (keyPressed.KeyChar.ToString() == "a")
{
DrawUI();
}
}
#endregion
#region functional methods
public static void CleanUI()
{
Console.SetCursorPosition(0, 5);
ClearCurrentConsoleLine();
Console.SetCursorPosition(0, 6);
ClearCurrentConsoleLine();
Console.SetCursorPosition(0, 7);
ClearCurrentConsoleLine();
Console.SetCursorPosition(0, 5);
}
public static void ClearCurrentConsoleLine()
{
int currentLineCursor = Console.CursorTop;
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, currentLineCursor);
}
#endregion
}
}