Консольное меню на c#
Я нашел кучу примеров, но все они либо настолько плохие, что я не знаю как даже их них что-то сделать хорошее, либо они не решают моей проблемы. (а на англоязычном стаке наоборот сложные примеры)
static void Main(string[] args)
{
bool bTest = true;
Console.CursorVisible = false;
Console.WriteLine("Пункт 1");
Console.WriteLine("Пункт 2");
while (true)
{
ConsoleKeyInfo ck = Console.ReadKey();
switch (ck.Key)
{
case ConsoleKey.DownArrow:
Console.Clear();
Console.WriteLine("Пункт 1");
Console.WriteLine("Пункт 2");
break;
case ConsoleKey.UpArrow:
Console.Clear();
Console.WriteLine("Пункт 1");
Console.WriteLine("Пункт 2");
break;
case ConsoleKey.Enter:
if (bTest)
{
//Метод 1;
}
else
{
//Метод 2;
}
break;
}
}
}
Мне нужно, чтобы я мог:
- Перемещаться по меню стрелочками (вроде как реализовано, только иногда приходится два раза нажимать на стрелочку).
- Чтобы выбранный пункт подсвечивался цветом.
- Нажатием enter этот пункт выполнялся (это вроде как реализовал, но почему-то он выполняет всегда только первый пункт и не очищает перед этим консоль).
- Была возможность вернуться в главное меню после выполненного одного из пунктов
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Вот самый черновой пример. Если вы с ООП не знакомы, то хотя-бы методы то создавать, надеюсь умеете.
static void Main(string[] args)
{
string[] menuItems = new string[] { "Пункт 1", "Пункт 2", "Выход" };
Console.WriteLine("Меню");
Console.WriteLine();
int row = Console.CursorTop;
int col = Console.CursorLeft;
int index = 0;
while (true)
{
DrawMenu(menuItems, row, col, index);
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.DownArrow:
if (index < menuItems.Length - 1)
index++;
break;
case ConsoleKey.UpArrow:
if (index > 0)
index--;
break;
case ConsoleKey.Enter:
switch (index)
{
case 2:
Console.WriteLine("Выбран выход из приложения");
return;
default:
Console.WriteLine($"Выбран пункт {menuItems[index]}");
break;
}
break;
}
}
}
private static void DrawMenu(string[] items, int row, int col, int index)
{
Console.SetCursorPosition(col, row);
for (int i = 0; i < items.Length; i++)
{
if (i == index)
{
Console.BackgroundColor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Black;
}
Console.WriteLine(items[i]);
Console.ResetColor();
}
Console.WriteLine();
}
Вывод в консоль
