Покритикуйте код: консольная менюшка - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д