首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在控制台应用程序中实现导航菜单

问在控制台应用程序中实现导航菜单
EN

Stack Overflow用户
提问于 2014-07-21 07:18:39
回答 2查看 5.1K关注 0票数 3

我正在尝试用多个多级子菜单(路径类型菜单)实现复杂的控制台菜单。也许有人建议在我的情况下使用什么样的设计模式?

顶部菜单示例

*主菜单* 1.列出虚拟服务器2.列表图像模板3.退出

如果选择了1,则会出现下一个子菜单。

*列出虚拟服务器* 1.虚拟服务器#12.虚拟服务器# 2 .虚拟服务器# 3 .虚拟服务器#3.返回

如果选择了例如2,则会出现下一个子菜单。

*虚拟服务器命令#2 * 1.删除2.返回

我目前的导航代码如下,这是只为第一个顶部菜单,不确定如何实现多级路径类型菜单与全面导航上下通过菜单。

代码语言:javascript
复制
static void Main(string[] args)
{

    Console.WriteLine("1. List Virtual Servers" +
       Environment.NewLine + "2. List Image Templates" +
       Environment.NewLine + "3. Exit");

    var input = Console.ReadKey();
    var key = input.KeyChar;
    int value;
    if (int.TryParse(key.ToString(), out value))
    {
        Console.WriteLine();
        RouteChoice(value);
    }
    else
    {
        Console.WriteLine("Invalid Entry.");
    }

    Console.Write("Press any key to exit...");
    Console.ReadKey(false);

    Console.ReadLine();

}

private static void RouteChoice(int menuChoice)
{
    switch (menuChoice)
    {
        case 1:
            GetVirtualServers();
            break;
        case 2:
            GetImageTemplate();
            break;                
        default:
            Console.WriteLine("Invalid Entry!");
            break;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-21 08:09:02

我的想法是将菜单项的层次结构建模为树,并在用户浏览菜单时遍历这棵树。从设计模式的角度来看,它将是复合和命令+一些树遍历的混合体。为此,我们需要:

  1. 一个基类BaseCommand,用于建模菜单中的每个命令。
  2. 从BaseCommand派生的用于菜单项的基类命令,该命令在树中执行某些逻辑-用于leafs。
  3. 从CompositeCommand派生的基类BaseCommand,用于带有子命令的命令。该类将具有子属性,它将存储类型为BaseCommand的对象。
  4. 每个可以执行某些逻辑的命令,例如Virtual #1,都应该从Command派生出来。
  5. 每个有子命令,例如列表虚拟服务器,都应该从CompositeCommand派生。
  6. 在程序开始时,您应该创建一个命令树。在你的例子中,在这棵树的根部,我们会找到主菜单。主菜单的子属性将包含对列表虚拟服务器、列表图像模板、退出等命令的引用。
  7. 这个解决方案的最后一部分是管理人员。经理是一个必须跟踪我们在树上的位置的类。当管理器接收到来自用户的输入时,他可以执行三件事:如果是叶,则执行当前命令;如果用户选择返回,则移动到当前命令的父命令;如果有当前命令,则移动到当前命令的子命令。
票数 5
EN

Stack Overflow用户

发布于 2016-01-28 12:17:58

我已经编写了控制台菜单,它可能是对您有用的起点。

CMenu是一个在.Net中构建控制台菜单的轻量级的、低仪式的框架。您不用手动提示用户输入和解析它,而是以简短、结构化和全面的方式定义命令,让CMenu来处理其余的命令。 CMenu的目标是低开销-简单的东西应该是简单的实现。如果你不使用一个功能,你不需要知道它的任何东西。 同时,支持复杂的场景。大型菜单可以很容易地分成几个类。背景自配置。你不需要担心所有烦人的细节涉及到更大的菜单,它将只是工作。 最重要的是,它是非常简单和快速的使用。命令可以缩写,智能解析器甚至支持部分匹配。帮助命令是集成的。

它的编写并没有考虑到这种编号的操作风格,但是它可以被模仿,如果您将命令命名为“1.foo”、“2.bar”等,它应该可以很好地工作。

继承系统非常简单(只从CMenuItem派生并覆盖Execute),或者如果您愿意,甚至可以使用lambdas代替。

代码语言:javascript
复制
var menu = new CMenu ();
menu.Add ("1. foo", s => Console.WriteLine ("Foo!"));
menu.Add ("2. bar", s => Console.WriteLine ("Bar!"));
menu.Run ();

菜单项树支持得很好,请参阅此页为示例。例如(创建分层菜单的其他方法):

代码语言:javascript
复制
var m = new CMenu () {
    new CMenuItem ("1") {
        new CMenuItem ("1", s => Console.WriteLine ("1-1")),
        new CMenuItem ("2", s => Console.WriteLine ("1-2")),
    },
    new CMenuItem ("2") {
        new CMenuItem ("1", s => Console.WriteLine ("2-1")),
        new CMenuItem ("2", s => Console.WriteLine ("2-2")),
    },
};

更新:下一个版本(0.8)中将包含通过单号键按下的选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24859559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档