如何在C#Console中突出显示和选择Console文本
我希望创建一个老式的终端仿真,创建命令似乎很容易,但我想给用户一个非常老式的UI界面。我希望能够将文本打印到控制台,例如:“Logs”,然后当用户按下箭头键时,我希望它高亮显示,一旦选中,我希望能够点击enter并执行所选命令。顺便说一句,我正在使用Visual Studio Express 2012进行桌面操作。我认为您必须重写已经在屏幕上显示的行,以更改它们的颜色和背景,作为对箭头输入的响应 我想你可以用如何在C#Console中突出显示和选择Console文本,c#,user-interface,console,selection,highlight,C#,User Interface,Console,Selection,Highlight,我希望创建一个老式的终端仿真,创建命令似乎很容易,但我想给用户一个非常老式的UI界面。我希望能够将文本打印到控制台,例如:“Logs”,然后当用户按下箭头键时,我希望它高亮显示,一旦选中,我希望能够点击enter并执行所选命令。顺便说一句,我正在使用Visual Studio Express 2012进行桌面操作。我认为您必须重写已经在屏幕上显示的行,以更改它们的颜色和背景,作为对箭头输入的响应 我想你可以用 Console.SetCursorPosition 将光标放回要更改颜色的行,然后
Console.SetCursorPosition
将光标放回要更改颜色的行,然后
Console.BackgroundColor
Console.ForegroundColor
Console.ResetColor()
修改您所写内容的颜色
所以基本上你需要
- 启动时清除屏幕以了解每个选项的位置
- 对魔法按键做出反应
- 重写魔术按键突出显示的项目的颜色/背景
Console.Clear();
Console.WriteLine("Option 1");
Console.WriteLine("Option 2");
Console.WriteLine("Option 3");
Console.WriteLine();
Console.Write("input: ");
var originalpos = Console.CursorTop;
var k = Console.ReadKey();
var i = 2;
while (k.KeyChar != 'q')
{
if (k.Key == ConsoleKey.UpArrow)
{
Console.SetCursorPosition(0, Console.CursorTop - i);
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;
Console.WriteLine("Option " + (Console.CursorTop + 1));
Console.ResetColor();
i++;
}
Console.SetCursorPosition(8, originalpos);
k = Console.ReadKey();
}
我认为,创建一个例程,在屏幕上打印所有必要的文本,并在用户每次按下魔术键时重写整个文本可能会更容易。我也在寻找同样的东西,所以我自己完成了。我通过反转前景和背景的颜色来模拟高亮显示 它使用箭头键来导航选项,光标也被设置为不可见以使其看起来很漂亮
class Program
{
static int win_W;
static int win_H;
static void Main(string[] args)
{
Boolean running = true;
win_W = Console.WindowWidth;
win_H = Console.WindowHeight;
Console.CursorVisible = false;
int slct = 0;
// int1 is posX, int2 is posY, string is the text you want to show as the option and boolean shows if its selected
List<Tuple<int, int, string, Boolean>> opts = new List<Tuple<int, int, string, Boolean>>
{
new Tuple<int, int, string, Boolean>((win_W/2)-4, (win_H / 2) - 5, "OPTION 1", true),
new Tuple<int, int, string, Boolean>((win_W/2)-4, (win_H / 2) - 4, "OPTION 2", false),
new Tuple<int, int, string, Boolean>((win_W/2)-4, (win_H / 2) - 3, "OPTION 3", false),
};
while (running == true)
{
foreach (Tuple<int,int, string, Boolean> tupe in opts)
{
if (tupe.Item4 == true)
{
//sets the variable 'slct' to be equal to the index of the tuple value with the true value
slct = opts.FindIndex(t => t.Item3 == tupe.Item3);
Console.SetCursorPosition(tupe.Item1, tupe.Item2);
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;
Console.Write(tupe.Item3);
}
else if (tupe.Item4 == false)
{
Console.SetCursorPosition(tupe.Item1, tupe.Item2);
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Black;
Console.Write(tupe.Item3);
}
}
//Weird glitch when you take this out
Console.SetCursorPosition(opts[2].Item1 + 1, opts[2].Item2);
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Black;
Console.Write("");
//A little question mark appears on the bottom option when you press escape
//And when you go from option 3 to option 2 it leaves one block to the right highlighted
string inp = Console.ReadKey().Key.ToString();
if (inp == "UpArrow" && slct > 0)
{
opts[slct] = new Tuple<int, int, string, bool>(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, false);
slct -= 1;
opts[slct] = new Tuple<int, int, string, bool>(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, true);
}
else if (inp == "DownArrow" && slct < 2)
{
opts[slct] = new Tuple<int, int, string, bool>(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, false);
slct += 1;
opts[slct] = new Tuple<int, int, string, bool>(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, true);
}
}
}
}
类程序
{
静态积分;
静态积分;
静态void Main(字符串[]参数)
{
布尔运行=真;
win_W=控制台窗口宽度;
win_H=控制台。窗口高度;
Console.CursorVisible=false;
int-slct=0;
//int1是posX,int2是posY,string是要显示为选项的文本,boolean显示它是否被选中
列表选项=新列表
{
新元组((win_W/2)-4,(win_H/2)-5,“选项1”,正确),
新元组((win_W/2)-4,(win_H/2)-4,“选项2”,false),
新元组((win_W/2)-4,(win_H/2)-3,“选项3”,false),
};
while(running==true)
{
foreach(opts中的元组)
{
if(tupe.Item4==true)
{
//将变量“slct”设置为等于具有真值的元组值的索引
slct=opts.FindIndex(t=>t.Item3==tupe.Item3);
Console.SetCursorPosition(tupe.Item1,tupe.Item2);
Console.ForegroundColor=ConsoleColor.Black;
Console.BackgroundColor=ConsoleColor.White;
Console.Write(tupe.Item3);
}
else if(tupe.Item4==false)
{
Console.SetCursorPosition(tupe.Item1,tupe.Item2);
Console.ForegroundColor=ConsoleColor.White;
Console.BackgroundColor=ConsoleColor.Black;
Console.Write(tupe.Item3);
}
}
//当你把这个拿出来的时候会有奇怪的小故障
Console.SetCursorPosition(选项[2].Item1+1,选项[2].Item2);
Console.ForegroundColor=ConsoleColor.White;
Console.BackgroundColor=ConsoleColor.Black;
控制台。写(“”);
//按escape时,底部选项上会出现一个小问号
//当您从选项3转到选项2时,它会在右侧突出显示一个块
字符串inp=Console.ReadKey().Key.ToString();
如果(inp==“向上箭头”&&slct>0)
{
opts[slct]=新元组(opts[slct].Item1,opts[slct].Item2,opts[slct].Item3,false);
slct-=1;
opts[slct]=新元组(opts[slct].Item1,opts[slct].Item2,opts[slct].Item3,true);
}
否则如果(inp==“向下箭头”&&slct<2)
{
opts[slct]=新元组(opts[slct].Item1,opts[slct].Item2,opts[slct].Item3,false);
slct+=1;
opts[slct]=新元组(opts[slct].Item1,opts[slct].Item2,opts[slct].Item3,true);
}
}
}
}