SkyRez.ConsoleMenu 5.7.1.18

dotnet add package SkyRez.ConsoleMenu --version 5.7.1.18
                    
NuGet\Install-Package SkyRez.ConsoleMenu -Version 5.7.1.18
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SkyRez.ConsoleMenu" Version="5.7.1.18" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="SkyRez.ConsoleMenu" Version="5.7.1.18" />
                    
Directory.Packages.props
<PackageReference Include="SkyRez.ConsoleMenu" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add SkyRez.ConsoleMenu --version 5.7.1.18
                    
#r "nuget: SkyRez.ConsoleMenu, 5.7.1.18"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package SkyRez.ConsoleMenu@5.7.1.18
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=SkyRez.ConsoleMenu&version=5.7.1.18
                    
Install as a Cake Addin
#tool nuget:?package=SkyRez.ConsoleMenu&version=5.7.1.18
                    
Install as a Cake Tool

Библиотека ConsoleMenu

Библиотека ConsoleMenu предоставляет простой способ создания интерактивных текстовых меню в консольных приложениях на C#. Она поддерживает два основных типа меню:

  • SelectMenu: для выбора одного из предложенных вариантов.
  • InputMenu: для организации ввода нескольких полей данных от пользователя с поддержкой валидации типов.

Установка

Для использования библиотеки ConsoleMenu, добавьте следующий using в вашем коде, например, в файл Usings.cs или в начало вашего файла:

global using ConsoleMenu;

Использование SelectMenu (Меню выбора)

Класс SelectMenu позволяет создавать меню, в которых пользователь может выбрать один из предложенных вариантов с помощью клавиш со стрелками.

1. Создание меню

Вы можете создать экземпляр SelectMenu, используя конструктор и передав ему заголовок и элементы меню. Элементы меню — это экземпляры SelectMenuItem, которые содержат текст для отображения и необязательное действие (Action), выполняемое при выборе.

// Создание меню с заголовком и начальными элементами
SelectMenu mainMenu = new("Основное меню",
    new SelectMenuItem("Пункт 1", () => Console.WriteLine("Выбран пункт 1")),
    new SelectMenuItem("Пункт 2", () => Console.WriteLine("Выбран пункт 2"))
);

// Добавление дополнительных элементов с помощью Fluent API
mainMenu.AddMenuItem("Пункт 3", () => Console.WriteLine("Выбран пункт 3"))
        .AddMenuItem("Выход"); // Элемент без действия

2. Отображение меню и обработка выбора

Метод Apply() отображает меню, ожидает выбора пользователя (клавиши Enter или Escape) и возвращает индекс (ushort) выбранного элемента. Если для выбранного SelectMenuItem было задано действие (Action), оно будет автоматически выполнено при нажатии Enter.

// Способ 1: Автоматическое выполнение действия
// Метод Apply() отобразит меню и вызовет Action, связанный с выбранным пунктом.
mainMenu.Apply();

// Способ 2: Ручная обработка по индексу
// Метод Apply() все равно вызовет Action (если он есть), но также вернёт индекс.
// Это полезно для дополнительной логики, например, в операторе switch.
ushort choice = mainMenu.Apply();
switch (choice)
{
    case 0:
        Console.WriteLine("Дополнительная логика для пункта 1...");
        break;
    case 3: // Индекс пункта "Выход"
        return; // Выходим из цикла или программы
    // ...
}

3. Настройка тем

Вы можете легко изменить внешний вид меню, присвоив свойству Theme одну из готовых тем из статического класса Themes или создав свою.

// Способ 1: Применить готовую тему из `Themes`
mainMenu.Theme = Themes.Green;

// Способ 2: Настроить цвета вручную с помощью метода SetThemes
mainMenu.SetThemes(
    titleTextColor:          ConsoleColor.Yellow,
    titleBackgroundColor:    ConsoleColor.Black,
    selectedTextColor:       ConsoleColor.Black,
    selectedBackgroundColor: ConsoleColor.Green,
    unselectedTextColor:     ConsoleColor.Gray,
    unselectedBackgroundColor: ConsoleColor.Black
);

// Способ 3: Создать и модифицировать свою тему на основе существующей
var customTheme = Themes.Classic; // Копируем классическую тему
customTheme.SelectedBackgroundColor = ConsoleColor.DarkMagenta;
customTheme.SelectedTextColor = ConsoleColor.White;
mainMenu.Theme = customTheme;

Использование InputMenu (Меню ввода)

InputMenu позволяет организовать удобный ввод данных от пользователя по нескольким полям, с валидацией типов и гибкой навигацией.

1. Создание меню

Вы создаете экземпляр InputMenu и добавляете в него элементы InputMenuItem. Каждый элемент имеет текст-приглашение, значение по умолчанию и уникальный идентификатор (Id). Тип вводимых данных автоматически определяется по типу defaultValue и ограничивает ввод пользователя.

// Создание меню ввода с помощью Fluent API.
// Тип поля определяется типом значения по умолчанию.
var inputMenu = new InputMenu("Введите данные для подключения")
    .AddMenuItem(
        text: "Адрес сервера", 
        defaultValue: "127.0.0.1", 
        id: "server_ip") // Тип string
    .AddMenuItem(
        text: "Порт", 
        defaultValue: (ushort)8080, 
        id: "port") // Тип ushort, ввод будет ограничен числами
    .AddMenuItem(
        text: "Использовать SSL", 
        defaultValue: true, 
        id: "use_ssl"); // Тип bool

// Пример с ограничением диапазона для числового значения
inputMenu.AddMenuItem(
    text: "Количество потоков (1-8)",
    defaultValue: 4,
    minValue: 1,
    maxValue: 8,
    id: "threads"); // Тип int с валидацией диапазона

Если Id не указан, он будет сгенерирован автоматически (начиная с "0").

2. Отображение и ввод данных

Метод Apply() отображает все поля ввода и управляет процессом:

  • Стрелки вверх/вниз: Перемещение между полями.
  • Стрелки влево/вправо, Backspace, Delete, Home, End: Редактирование текста в выбранном поле.
  • Ctrl + Стрелки влево/вправо: Перемещение по словам.
  • Если текст в поле ввода занимает несколько строк, стрелки вверх/вниз сначала перемещают курсор внутри этого поля.
  • Enter: Подтверждение всех введённых значений и завершение работы меню.
  • Escape: Отмена всех изменений и выход из меню.
// Отобразить меню и запустить процесс ввода. 
// Метод вернёт словарь с результатами.
var results = inputMenu.Apply();

3. Получение результатов

Метод Apply() возвращает Dictionary<string, InputMenuItem>. Ключ — это Id элемента, а значение — сам объект InputMenuItem, содержащий введённые данные. Это позволяет легко получить результат и безопасно преобразовать его к нужному типу.

// Отображаем меню и получаем результаты
Dictionary<string, InputMenuItem> results = inputMenu.Apply();

// Способ 1: Получить значения по ID и использовать их как строки
if (results.TryGetValue("server_ip", out var ipItem) && results.TryGetValue("port", out var portItem))
{
    Console.WriteLine($"Подключаемся к {ipItem.InputValue}:{portItem.InputValue}");
}

// Способ 2: Использовать методы-помощники для безопасного преобразования типов
if (results.TryGetValue("port", out var portItem))
{
    if (portItem.TryGetUShort(out ushort portNumber))
    {
        Console.WriteLine($"Порт в числовом формате: {portNumber}");
    }
    else
    {
        Console.WriteLine($"Не удалось преобразовать '{portItem.InputValue}' в число.");
    }
}

4. Настройка тем

Как и SelectMenu, InputMenu поддерживает настройку тем через свойство Theme.

// Способ 1: Применить готовую тему
inputMenu.Theme = Themes.Cyan;

// Способ 2: Создать и настроить свою тему
var customTheme = Themes.Classic;
customTheme.SelectedBackgroundColor = ConsoleColor.DarkBlue; // Цвет фона активного поля
customTheme.SelectedTextColor = ConsoleColor.White;       // Цвет текста активного поля
inputMenu.Theme = customTheme;

Пример использования в коде

Ниже приведён полный пример консольного приложения, демонстрирующий совместное использование SelectMenu и InputMenu.

using System;
using System.Collections.Generic;
using ConsoleMenu; // Убедитесь, что using добавлен

public static class Program
{
    // Хранилище "настроек" для примера
    private static string playerName = "User";
    private static byte playerAge = 25;
    
    public static void Main()
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;

        // Создаем меню для ввода настроек
        var settingsInputMenu = new InputMenu("Настройки игрока")
            .AddMenuItem("Введите новое имя", playerName, "player_name")
            .AddMenuItem("Введите возраст", playerAge, "player_age"); // Тип byte определяется автоматически
        settingsInputMenu.Theme = Themes.Yellow;

        // Создаем меню настроек, которое вызывает меню ввода
        var settingsMenu = new SelectMenu("Настройки")
            .AddMenuItem("Изменить данные игрока", () => 
            {
                // Запускаем меню ввода и получаем результат
                Dictionary<string, InputMenuItem> results = settingsInputMenu.Apply(clear: true); 

                // После ввода обновляем наши переменные
                if (results.TryGetValue("player_name", out var nameItem) && !string.IsNullOrEmpty(nameItem.InputValue))
                {
                    playerName = nameItem.InputValue;
                }
                if (results.TryGetValue("player_age", out var ageItem) && ageItem.TryGetByte(out byte newAge))
                {
                    playerAge = newAge;
                }
                
                Console.WriteLine($"\nНастройки обновлены. Имя: {playerName}, Возраст: {playerAge}");
                Console.ReadKey();
            })
            .AddMenuItem("Назад");
        settingsMenu.Theme = Themes.Cyan;

        // Создаем главное меню
        var mainMenu = new SelectMenu("Главное меню")
            .AddMenuItem("Начать игру", () => Console.WriteLine($"Игра началась! Привет, {playerName}! Тебе {playerAge} лет."))
            .AddMenuItem("Настройки", () => settingsMenu.Apply(clear: true)) // Вложенное меню выбора
            .AddMenuItem("Выход");
        mainMenu.Theme = Themes.Blue;
            
        // Запускаем главный цикл меню
        while (true)
        {
            Console.Clear();
            ushort choice = mainMenu.Apply(clear: false); // Отображаем меню

            if (mainMenu.MenuItems[choice].Text == "Выход")
            {
                break;
            }
            
            Console.WriteLine("\nНажмите любую клавишу для возврата в меню...");
            Console.ReadKey();
        }
        Console.Clear();
        Console.WriteLine("Программа завершена.");
    }
}
Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 is compatible.  netcoreapp3.1 is compatible. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETCoreApp 3.0

    • No dependencies.
  • .NETCoreApp 3.1

    • No dependencies.
  • .NETStandard 2.1

    • No dependencies.
  • net5.0

    • No dependencies.
  • net6.0

    • No dependencies.
  • net7.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
5.7.1.18 273 7/1/2025
3.9.16.19 250 9/16/2023
3.9.10.3 260 9/9/2023
3.9.10.2 242 9/9/2023
3.1.20.11 418 1/20/2023
3.1.20.10 396 1/20/2023
3.1.13.4 407 1/20/2023
2.11.29.15 467 11/29/2022
2.11.29.2 448 11/28/2022
2.11.22.2 461 11/21/2022
2.11.22.1 457 11/21/2022
2.11.17.2 485 11/16/2022