我正在编写控制台程序,我的代码如下所示:
Configuration.cs
public static class Configuration
{
public static string Message = "";
}
Menu.cs
class Menu
{
public static void showMenu()
{
Console.Clear();
Console.WriteLine("1: SOMETHING");
Console.WriteLine("2: SOMETHING");
Console.WriteLine("3: SOMETHING");
Console.WriteLine("SYSTEM MSG: " + Configuration.Message);
Console.Write("INPUT: ");
}
}
Program.cs的
...
static void Main(string[] args)
{
...
int choice;
while(true)
{
Menu.showMenu();
choice = Convert.ToInt32(Console.ReadLine());
switch(choice)
{
case 1:
Configuration.Message = "HELLO!";
break;
case 2:
Configuration.Message = "HI!";
break;
case 3:
Configuration.Message = "WHAT?!";
break;
}
}
}
...
现在,当我更改Configuration.Message时,它会显示在菜单上,因为showMenu方法会清除控制台并再次显示字符串。
但我想要的是没有Clear方法,我想实时显示Configuration.Message。我当时正在考虑使用Timer并每秒刷新菜单,但效率不高(感觉就像作弊)。我怎么能这样做?
答案 0 :(得分:4)
当您写入Console
时,写入操作从当前光标位置开始。所以......
查看System.Console
类的属性和方法,特别是:
CursorLeft
获取或设置光标的列位置CursorTop
获取或设置光标的行位置SetCursorPosition( int left , int top )
设置行和列位置。在写入每个字符时,光标向右移动一个位置,当光标移过BufferWidth
列时包裹到下一行(例如,如果您的控制台缓冲区为80列宽,则写入第80列将使列超出缓冲区(第81列),因此光标将移动到下一行的第1列。
对于您想要做的事情,您还可以查看P /调用本机Win32游标方法,或使用类似* nix的curses(3)
和Gnu ncurses(3)
的.Net派生之一:
答案 1 :(得分:3)
我建议如果这样的功能是必要的,那么看看像WPF这样的UI技术会更好。但是,话虽这么说,也许这会做你想要的。每次设置消息时显示菜单。我不认为在使用控制台时,有一种方法可以将变量绑定到控制台上的某些消息。
public static class Configuration
{
private static string _message;
public static string Message
{
get
{
return _message;
}
set
{
_message = value;
Menu.showMenu();
}
}
}
编辑:要使用属性更改事件来实现此功能,您可以执行以下操作。注意,我没有实现INotifyPropertyChanged
以保持静态类。
class Program
{
static void Main(string[] args)
{
Configuration.PropertyChanged += (sender, e) =>
{
Menu.showMenu();
};
int choice;
while (true)
{
Menu.showMenu();
choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 1:
Configuration.Message = "HELLO!";
break;
case 2:
Configuration.Message = "HI!";
break;
case 3:
Configuration.Message = "WHAT?!";
break;
}
}
}
}
class Menu
{
public static void showMenu()
{
Console.Clear();
Console.WriteLine("1: SOMETHING");
Console.WriteLine("2: SOMETHING");
Console.WriteLine("3: SOMETHING");
Console.WriteLine("SYSTEM MSG: " + Configuration.Message);
Console.Write("INPUT: ");
}
}
public static class Configuration
{
public static event PropertyChangedEventHandler PropertyChanged;
private static string _message;
public static string Message
{
get
{
return _message;
}
set
{
if (value != _message)
{
_message = value;
NotifyPropertyChanged(property: _message);
}
}
}
private static void NotifyPropertyChanged(object property, String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(property, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 2 :(得分:3)
当用户点击进入时显示菜单。
除了响应用户的输入之外,写入控制台不是一个好主意。这样做的原因是你可能会在控制台中间写入他们想要的行。然后他们的文本和退格键将变得不同步,用户将很难理解正在发生的事情。
我的建议是添加另一个选项,以便用户可以在没有选择的情况下点击ENTER
,并且会在没有清除的情况下重新显示菜单。这样,用户只需按ENTER
而不选择选项即可决定何时实时刷新。
如果您真的想要更实时的方法,并希望将其与用户输入混合使用,我建议控制台不是提供此解决方案的好方法。