C# 控制台应用程序 - 如何制作交互式菜单?
C# Console app - How do I make an interactive menu?
我正在尝试制作类似于以下内容的菜单:
> Thing
Another Thing
Yet Another Thing
Exit
在 C# 控制台应用程序中。
我找遍了,但找不到此类菜单的 library/example 代码。
简单地说,我想...
- 显示菜单
- 允许用户使用箭头键进行选择[UP/DOWN]
- 选择不同的选项时执行不同的操作 [Enter]
主要是能够捕获输入。通过清除控制台 window 并再次重新呈现,控制台只能 "simulate" 交互式菜单。
using System.Collections.Generic;
using System;
using System.Linq;
using System.Threading;
namespace ConsoleApp
{
class Program
{
public static List<Option> options;
static void Main(string[] args)
{
// Create options that you want your menu to have
options = new List<Option>
{
new Option("Thing", () => WriteTemporaryMessage("Hi")),
new Option("Another Thing", () => WriteTemporaryMessage("How Are You")),
new Option("Yet Another Thing", () => WriteTemporaryMessage("Today")),
new Option("Exit", () => Environment.Exit(0)),
};
// Set the default index of the selected item to be the first
int index = 0;
// Write the menu out
WriteMenu(options, options[index]);
// Store key info in here
ConsoleKeyInfo keyinfo;
do
{
keyinfo = Console.ReadKey();
// Handle each key input (down arrow will write the menu again with a different selected item)
if (keyinfo.Key == ConsoleKey.DownArrow)
{
if (index + 1 < options.Count)
{
index++;
WriteMenu(options, options[index]);
}
}
if (keyinfo.Key == ConsoleKey.UpArrow)
{
if (index - 1 >= 0)
{
index--;
WriteMenu(options, options[index]);
}
}
// Handle different action for the option
if (keyinfo.Key == ConsoleKey.Enter)
{
options[index].Selected.Invoke();
index = 0;
}
}
while (keyinfo.Key != ConsoleKey.X);
Console.ReadKey();
}
// Default action of all the options. You can create more methods
static void WriteTemporaryMessage(string message)
{
Console.Clear();
Console.WriteLine(message);
Thread.Sleep(3000);
WriteMenu(options, options.First());
}
static void WriteMenu(List<Option> options, Option selectedOption)
{
Console.Clear();
foreach (Option option in options)
{
if (option == selectedOption)
{
Console.Write("> ");
}
else
{
Console.Write(" ");
}
Console.WriteLine(option.Name);
}
}
}
public class Option
{
public string Name { get; }
public Action Selected { get; }
public Option(string name, Action selected)
{
Name = name;
Selected = selected;
}
}
}
我正在尝试制作类似于以下内容的菜单:
> Thing
Another Thing
Yet Another Thing
Exit
在 C# 控制台应用程序中。 我找遍了,但找不到此类菜单的 library/example 代码。
简单地说,我想...
- 显示菜单
- 允许用户使用箭头键进行选择[UP/DOWN]
- 选择不同的选项时执行不同的操作 [Enter]
主要是能够捕获输入。通过清除控制台 window 并再次重新呈现,控制台只能 "simulate" 交互式菜单。
using System.Collections.Generic;
using System;
using System.Linq;
using System.Threading;
namespace ConsoleApp
{
class Program
{
public static List<Option> options;
static void Main(string[] args)
{
// Create options that you want your menu to have
options = new List<Option>
{
new Option("Thing", () => WriteTemporaryMessage("Hi")),
new Option("Another Thing", () => WriteTemporaryMessage("How Are You")),
new Option("Yet Another Thing", () => WriteTemporaryMessage("Today")),
new Option("Exit", () => Environment.Exit(0)),
};
// Set the default index of the selected item to be the first
int index = 0;
// Write the menu out
WriteMenu(options, options[index]);
// Store key info in here
ConsoleKeyInfo keyinfo;
do
{
keyinfo = Console.ReadKey();
// Handle each key input (down arrow will write the menu again with a different selected item)
if (keyinfo.Key == ConsoleKey.DownArrow)
{
if (index + 1 < options.Count)
{
index++;
WriteMenu(options, options[index]);
}
}
if (keyinfo.Key == ConsoleKey.UpArrow)
{
if (index - 1 >= 0)
{
index--;
WriteMenu(options, options[index]);
}
}
// Handle different action for the option
if (keyinfo.Key == ConsoleKey.Enter)
{
options[index].Selected.Invoke();
index = 0;
}
}
while (keyinfo.Key != ConsoleKey.X);
Console.ReadKey();
}
// Default action of all the options. You can create more methods
static void WriteTemporaryMessage(string message)
{
Console.Clear();
Console.WriteLine(message);
Thread.Sleep(3000);
WriteMenu(options, options.First());
}
static void WriteMenu(List<Option> options, Option selectedOption)
{
Console.Clear();
foreach (Option option in options)
{
if (option == selectedOption)
{
Console.Write("> ");
}
else
{
Console.Write(" ");
}
Console.WriteLine(option.Name);
}
}
}
public class Option
{
public string Name { get; }
public Action Selected { get; }
public Option(string name, Action selected)
{
Name = name;
Selected = selected;
}
}
}