c# - 根据用户击键更改控制台上的字符

标签 c# console

我想做的是根据用户按下的内容更改控制台。

所以我有一个包含如下三个选项的控制台:

>  Option 1

Option 2

Option 3

基本上,如果用户按下向下箭头,控制台会变成这样:

Option 1

>  Option 2

Option 3

如果用户按下向上箭头,控制台会返回到初始状态。

我知道如何使用 Console.ReadKey() 读取用户的输入,但我不知道如何修改已写入的输出。

最后一件事是,当用户按下回车键时,控制台不会创建新行,而是选择其中一个选项并调用委托(delegate)。

最佳答案

使用 Console.ReadKey 和一些变量来保存所选选项的状态并不难实现。

下面的代码是您正在寻找的一个非常快速和惰性的实现。花点时间自己正确地重写它 - 这是为了让您了解如何实现您正在寻找的东西。

static void Main(string[] args)
{
    bool IsRunning = true;
    int Selected = 1;

    while (IsRunning)
    {
        ConsoleKeyInfo NextKey = new ConsoleKeyInfo();

        if (Selected < 1)
            Selected = 3;
        else if (Selected > 3)
            Selected = 1;

        Console.Clear();
        if (Selected == 1)
            Console.Write("> ");
        Console.WriteLine("Option 1");
        Console.WriteLine();
        if (Selected == 2)
            Console.Write("> ");
        Console.WriteLine("Option 2");
        Console.WriteLine();
        if (Selected == 3)
            Console.Write("> ");
        Console.WriteLine("Option 3");
        Console.WriteLine();
        Console.Write("Choose an option (Q to Quit): ");

        while (!(NextKey.Key == ConsoleKey.DownArrow ||
                NextKey.Key == ConsoleKey.UpArrow ||
                NextKey.Key == ConsoleKey.Q ||
                (NextKey.KeyChar >= '1' &&
                NextKey.KeyChar <= '3')))
        {
            NextKey = Console.ReadKey();
        }

        switch (NextKey.Key)
        {
            case ConsoleKey.D1:
                // Do something
                break;

            case ConsoleKey.D2:
                // Do something
                break;

            case ConsoleKey.D3:
                // Do something
                break;

            case ConsoleKey.DownArrow:
                Selected++;
                break;

            case ConsoleKey.UpArrow:
                Selected--;
                break;

            case ConsoleKey.Q:
                IsRunning = false;
                break;
        }
    }
}

代码将在未按下“Q”键退出应用程序时循环。

按下或向上箭头将轮流显示可用选项。

按下 1、2 或 3 后,您将导致运行 switch 语句中的 //Do something 行。您应该在此处调用每个选项存在的任何功能。

为了使用所选选项更新“菜单”,清除控制台输出然后重新输出。正确的选项通过 Selected 变量识别。

还有其他几种方法可以实现上述内容,其中一些更加简洁。我想让你知道从哪里开始。我并不是说这是最好或最整洁的解决方案。

编辑

一个想法出现了——您想使用 Enter 来选择选项。

我稍微修改了代码以提供该功能:

    while (!(NextKey.Key == ConsoleKey.DownArrow ||
            NextKey.Key == ConsoleKey.UpArrow ||
            NextKey.Key == ConsoleKey.Q ||
            NextKey.Key ==  ConsoleKey.Enter))
    {
        NextKey = Console.ReadKey();
    }

    switch (NextKey.Key)
    {
        case ConsoleKey.Enter:
            // Do something depending on Selected option
            switch (Selected)
            {
                case 1:
                    // Do something
                    break;

                case 2:
                    // Do something
                    break;

                case 3:
                    // Do something
                    break;
            }
            break;

        case ConsoleKey.DownArrow:
        ...

关于c# - 根据用户击键更改控制台上的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469910/

相关文章:

c# - 最佳实践 : ref parameter or return value?

c# - 即使成功登录后,Azure 移动应用程序也会返回 401(未经授权)。

java - 如何显示java控制台

c++ - 显示控制台和 win32 GUI

java - 如何检查应用程序是否在命令行上运行?

c# - 想要使用 javascript 显示消息框

c# - 更改数组中索引的值,将从旧索引开始的索引向右移动,同时保留左侧的所有索引不变

c# - C++ Vector 类似于 C# 中的类

console - 在其他端口上运行 sails 控制台,然后 sails 抬起

c++ - 由于 cout<<cin.rdbuf() 导致无限循环,为什么?