Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#Console中突出显示和选择Console文本_C#_User Interface_Console_Selection_Highlight - Fatal编程技术网

如何在C#Console中突出显示和选择Console文本

如何在C#Console中突出显示和选择Console文本,c#,user-interface,console,selection,highlight,C#,User Interface,Console,Selection,Highlight,我希望创建一个老式的终端仿真,创建命令似乎很容易,但我想给用户一个非常老式的UI界面。我希望能够将文本打印到控制台,例如:“Logs”,然后当用户按下箭头键时,我希望它高亮显示,一旦选中,我希望能够点击enter并执行所选命令。顺便说一句,我正在使用Visual Studio Express 2012进行桌面操作。我认为您必须重写已经在屏幕上显示的行,以更改它们的颜色和背景,作为对箭头输入的响应 我想你可以用 Console.SetCursorPosition 将光标放回要更改颜色的行,然后

我希望创建一个老式的终端仿真,创建命令似乎很容易,但我想给用户一个非常老式的UI界面。我希望能够将文本打印到控制台,例如:“Logs”,然后当用户按下箭头键时,我希望它高亮显示,一旦选中,我希望能够点击enter并执行所选命令。顺便说一句,我正在使用Visual Studio Express 2012进行桌面操作。

我认为您必须重写已经在屏幕上显示的行,以更改它们的颜色和背景,作为对箭头输入的响应

我想你可以用

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);
}
}
}
}