2013-03-17 34 views
3

我想在C#一个简单的菜单,如: 这样的事情应该打印出控制台:使在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也是如此。

我完全被卡住与此有关。

+0

http://img688.imageshack.us/img688/9655/menu2xa.png这样的事情,但与其他颜色 – 2013-03-17 16:33:41

+0

写作UI在诅咒真的很难,P – leppie 2013-03-17 16:41:30

+1

有你为什么不使用任何特殊的理由WinForms? – Shrikey 2013-03-17 16:56:57

回答

1

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

+0

什么方法?据我所知,它支持他想要做的一切。不确定颜色的变化,但我认为这也是可能的。 – 2013-03-17 16:45:40

2

我不能完全肯定..可能是这样可以帮助你上手。

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); 

    } 
1

的问题是,该控制台无法处理任何鼠标事件。你想如何点击菜单?你将不得不用钥匙做所有事情。您可以使用的选项是定义击键(例如Ctrl-F或“FirstEntry”的Alt-F)以激活菜单条目或使用箭头键实现导航,从而允许您在字段(按钮或菜单字段和文本字段)。这不是内置的,所以你将不得不在代码中做所有事情。您将不得不使用控制台的SetCursorPositionReadKey方法来实现此目的。我记得以前在VT100终端上做过这个。

0

我写了一个console menu library for C#。它没有鼠标支持,但它可能仍然是你的起点?

CMenu是一个轻量级,低规格的框架,用于在.Net中构建控制台 菜单。除了手动提示用户输入并解析它之外,您可以用一种简短的,结构化的和全面的方式定义命令,并让CMenu处理其余的部分。

CMenu的目的是为低开销 - 简单的东西应该是简单的 实现。如果你不使用一个功能,你不需要知道任何关于它的东西 。

与此同时,复杂的方案的支持。大菜单可以很容易地分成几个类。背景自我配置。 您不必担心所有涉及 较大菜单的烦人细节,它只会起作用。

最重要的是,它使用起来非常简单快捷。命令可以简化为 ,智能解析器甚至可以实现部分匹配。帮助 命令已集成。