Покритикуйте код: консольная менюшка - C#
Формулировка задачи:
простая консольная менюшка, пригодится для, скажем, объединения разных лабораторных работ в один файл (чтоб была возможность выбора). делал максимально просто для использования. прошу указать на ошибки в реализации.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication17
{
class MenuItem
{
public string Text { get; set; }
public Action Action { get; set; }
public MenuItem(string text, Action action)
{
Text = text;
Action = action;
}
public MenuItem()
{
}
public override string ToString()
{
return Text;
}
}
class Menu
{
private List<MenuItem> _items;
private int _cur;
private const char Arrow = (char)16;
private ConsoleColor _lastBackgroundColor;
private ConsoleColor _lastForegroundColor;
private void ChangeColor(ConsoleColor background, ConsoleColor foreground)
{
_lastBackgroundColor = Console.BackgroundColor;
_lastForegroundColor = Console.ForegroundColor;
Console.BackgroundColor = background;
Console.ForegroundColor = foreground;
}
private void RestoreColor()
{
Console.BackgroundColor = _lastBackgroundColor;
Console.ForegroundColor = _lastForegroundColor;
}
public int CurrentPosition
{
get
{
return _cur;
}
}
public void Draw()
{
Console.Clear();
for (var i = 0; i < _items.Count; i++)
if (_cur == i)
{
Console.Write(" {0} ", Arrow);
ChangeColor(ConsoleColor.Gray, ConsoleColor.Black);
Console.WriteLine("{0}", _items[i]);
RestoreColor();
}
else
Console.Write(" {0}\n", _items[i]);
}
public void Start()
{
while (true)
{
var keyInfo = Console.ReadKey(true);
switch (keyInfo.Key)
{
case ConsoleKey.UpArrow:
if (_cur == 0)
break;
_cur--;
Draw();
break;
case ConsoleKey.DownArrow:
if (_cur == _items.Count - 1)
break;
_cur++;
Draw();
break;
case ConsoleKey.Enter:
Console.Clear();
_items[_cur].Action();
return;
}
}
}
public void AddItem(MenuItem i)
{
_items.Add(i);
}
public void RemoveItem(MenuItem i)
{
_items.Remove(i);
}
public Menu()
{
_items = new List<MenuItem>();
_cur = 0;
Draw();
}
}
class Program
{
static void Main(string[] args)
{
var menu = new Menu();
menu.AddItem(new MenuItem
{
Action = () => Console.WriteLine("Hello 1"),
Text = "Test item 1"
});
menu.AddItem(new MenuItem
{
Action = () => Console.WriteLine("Hello 2"),
Text = "Test item 2"
});
menu.AddItem(new MenuItem
{
Action = () => Console.WriteLine("Hello 3"),
Text = "Test item 3"
});
menu.Start();
Console.ReadKey();
}
}
}Решение задачи: «Покритикуйте код: консольная менюшка»
textual
Листинг программы
public void Redraw()
{
Console.Clear();
for (var i = 0; i < _items.Count; i++)
DrawMenuItem(i);
DrawSelectedMenuItem();
}
private void DrawMenuItem(int index)
{
Console.SetCursorPosition(0, index);
Console.Write(" {0}\n", _items[index]);
}
private void DrawSelectedMenuItem()
{
if (_items.Count == 0) return;
int cursorTop = Console.CursorTop;
Console.SetCursorPosition(0, _cur);
Console.Write(" {0} ", Arrow);
ChangeColor(ConsoleColor.Gray, ConsoleColor.Black);
Console.WriteLine("{0}", _items[_cur]);
RestoreColor();
Console.CursorTop = cursorTop;
}
public void Start()
{
Redraw();
Console.CursorVisible = false;
while (true)
{
var keyInfo = Console.ReadKey(true);
switch (keyInfo.Key)
{
case ConsoleKey.UpArrow:
if (_cur == 0)
break;
DrawMenuItem(_cur--);
DrawSelectedMenuItem();
break;
case ConsoleKey.DownArrow:
if (_cur == _items.Count - 1)
break;
DrawMenuItem(_cur++);
DrawSelectedMenuItem();
break;
case ConsoleKey.Enter:
Console.Clear();
Console.CursorVisible = true;
_items[_cur].Action();
return;
}
}
}