用c#制作简单的控制台菜单

本文关键字:控制台 菜单 简单 | 更新日期: 2023-09-27 18:04:26

我想在c#中做一个简单的菜单:像这样的内容应该从控制台打印出来:

FirstOption 
SecondOption
Exit

到目前为止,这是我的代码(有命名和封装的问题,但这只是快速原型,花了大约30分钟):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Menu StartGame = new Menu("Start Game");
            Menu EndGame = new Menu("End Game");
            Console.WriteLine(StartGame);
            Console.WriteLine(End Game);
            EndGame.isChecked = false;
        }
    }
    class Menu
    {
        private string Content;
        public bool isChecked = true;
        public Menu(string Content)
        {
            this.Content = Content;
        }
        public void CheckCondition()
        {
            if (isChecked)
            {
                Console.BackgroundColor = ConsoleColor.White;
                Console.ForegroundColor = ConsoleColor.Black;
            }
            else
            {
                Console.ResetColor();
            }
        }
        public override string ToString()
        {
            this.CheckCondition();
            return this.Content;
        }
    }
}

这个想法是当一个按钮被点击菜单项突出显示。当到达最后一个菜单项时,不能再按DownArrow,第一个和UpArrow也是如此。

用c#制作简单的控制台菜单

我不完全确定…也许这能帮你开始。

while (true)
        {
            var ch = Console.ReadKey(false).Key;
            switch (ch)
            {
                case ConsoleKey.UpArrow:
                    HighlightStartGame();
                    break;
                case ConsoleKey.DownArrow:
                    HighlightEndGame();
                    break;
            }
        }
static void HighlightStartGame()
    {
        Console.Clear();
        Console.ResetColor();
        StartGame.isChecked = true;
        Console.WriteLine(StartGame);
        EndGame.isChecked = false;
        Console.WriteLine(EndGame);
    }
    static void HighlightEndGame()
    {
        Console.Clear();
        Console.ResetColor();
        StartGame.isChecked = false;
        Console.WriteLine(StartGame);
        EndGame.isChecked = true;
        Console.WriteLine(EndGame);
    }

不,你不能这样做,因为Win32控制台不支持这些方法。但是,您可以使用GDI在控制台窗口上绘制。

问题是控制台不能处理任何鼠标事件。您想怎样点击菜单?你将不得不用钥匙做所有的事情。您可以选择定义击键(如"FirstEntry"的Ctrl-F或Alt-F)来激活菜单项,或者使用箭头键实现导航,允许您移动字段(按钮或菜单字段和文本字段)。这不是内置的,所以您必须在代码中完成所有工作。您必须使用控制台的SetCursorPositionReadKey方法来实现这一点。我记得很久以前在VT100终端上就这样做过。

我已经为c#编写了一个控制台菜单库。它没有鼠标支持,但它可能仍然是你的一个起点?

CMenu是一个用于构建控制台的轻量级、简单的框架菜单。而不是手动提示用户输入和解析它时,您将命令定义为简短的、结构化的和,让CMenu处理其余的。

CMenu的目标是低开销-简单的东西应该简单实现。如果你不使用某个特性,你就不需要知道任何东西。

同时支持复杂场景。大菜单可以很容易被分成几个类。背景自我配置。你不必担心所有恼人的细节更大的菜单,它会工作。

最重要的是,它使用起来非常简单和快速。命令可以是简而言之,智能解析器甚至支持部分匹配。一个帮助命令集成