Haciendo menús y submenús con la consola de C# 2019.
La verdad que he cometido fallos y no se si es posible resolverlo, al menos no se hacerlo. Todo de momento está hecho en un único archivo en Visual Studioi 2019.
He hecho un esquema boceto para que se entienda.
Ver zoom.
Se ha hecho un esquema de todas las opciones para tener una vista rápida y una posible facilidad de compresión.
Si nada más ejecutar el programa o aplicación, pulso Enter, muestra las opciones aue son A, B y C, señalo Salir, pulso Enter vuelve al reloj, como debe ser, así susecibamente. Hasta ahí todo bien.
El problema es cuando estoy en la opción indicada aquí.
Lo único que me falla, si voy a la opción C-1, le doy salir, al llegar a la opción principal que pone:
Citar
Opción A.
Opción B.
> Opción C.
Opción B.
> Opción C.
Se me pone la flecha marcadore de opciónes siempre en Opción A, no se me guarda en la última opción seleccionada. Debo corregir esto, ya sería con una variable para memorizarlo.
Dejo el código hehco hasta el momento.
Código C#:
Código
using System; namespace Menu_consola_18_cs { class Program { static void Main(string[] args) { Console.Title = "Menú de opciones"; // Tamaño ventana consola. // X anchura. Console.WindowWidth = 20; // Y altura. Console.WindowHeight = 5; // Oculto el cursor. Console.CursorVisible = false; // Fondo verde. Console.BackgroundColor = ConsoleColor.Green; // Letras negras. Console.ForegroundColor = ConsoleColor.Black; MenuPrincipal(); } #region Menú principal. public static void MenuPrincipal() { // Almacena la tecla pulsada en la variable. ConsoleKey teclaInicial; // Limpiar pantalla. Console.Clear(); // Posición del cursor del título del MENÚ PRINCIPAL. Console.SetCursorPosition(0, 0); // Título. Console.Write(" MENÚ PRINCIPAL "); // Pocisión de la hora. Console.SetCursorPosition(4, 2); // Formato numérico dd/MM/yyyy. Console.Write(DateTime.Now.ToString("ddd dd MMM")); // Almacena en la variable una tecla pulsada. teclaInicial = Console.ReadKey(true).Key; // ¿Haz pulsado la tecla Enter? if (teclaInicial == ConsoleKey.Enter) { // Sí. Se ejecuta esta función. MenuOpciones(); } } #endregion #region Menú de opciones principales. public static void MenuOpciones() { // Contador de teclas y navegador. int opcion = 0; // Capturar tecla para luego validar. ConsoleKey tecla; while (true) { //****************************************************************** // Dibujo el menú principal. // Limpiar pantalla. Console.Clear(); switch (opcion) { case 0: Console.SetCursorPosition(0, 0); Console.Write("> Opción A. "); Console.SetCursorPosition(0, 1); Console.Write(" Opción B. "); Console.SetCursorPosition(0, 2); Console.Write(" Opción C. "); Console.SetCursorPosition(0, 3); Console.Write(" Salir. "); break; case 1: Console.SetCursorPosition(0, 0); Console.Write(" Opción A. "); Console.SetCursorPosition(0, 1); Console.Write("> Opción B. "); Console.SetCursorPosition(0, 2); Console.Write(" Opción C. "); Console.SetCursorPosition(0, 3); Console.Write(" Salir. "); break; case 2: Console.SetCursorPosition(0, 0); Console.Write(" Opción A. "); Console.SetCursorPosition(0, 1); Console.Write(" Opción B. "); Console.SetCursorPosition(0, 2); Console.Write("> Opción C. "); Console.SetCursorPosition(0, 3); Console.Write(" Salir. "); break; case 3: Console.SetCursorPosition(0, 0); Console.Write(" Opción A. "); Console.SetCursorPosition(0, 1); Console.Write(" Opción B. "); Console.SetCursorPosition(0, 2); Console.Write(" Opción C. "); Console.SetCursorPosition(0, 3); Console.Write("> Salir. "); break; default: Console.Write("Fuera de rango. "); break; } // Fin de pintar el menú principal. //****************************************************************** // Leer tecla ingresada por el usuario. tecla = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (tecla == ConsoleKey.Enter) { switch (opcion) { case 0: OpcionA(); break; case 1: OpcionB(); break; case 2: OpcionC(); break; case 3: MenuPrincipal(); break; default: break; } } // Flecha abajo del teclado. if (tecla == ConsoleKey.DownArrow) { opcion++; } // Flecha arriba del teclado. if (tecla == ConsoleKey.UpArrow) { opcion--; } // Si está en la última opción del menú, salta a la primera. if (opcion > 3) { opcion = 0; } // Si está en la primera posición del menú, salta a la última. if (opcion < 0) { opcion = 3; } } } #endregion #region Opción A (0). public static void OpcionA() { ConsoleKey teclaOpcionA; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción A."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para"); Console.SetCursorPosition(0, 3); Console.WriteLine("Salir."); // Almacena el teclado pulsado en la variable teclaSubMenuA. teclaOpcionA = Console.ReadKey(true).Key; } while (teclaOpcionA != ConsoleKey.Enter); } #endregion #region Opción B (1). public static void OpcionB() { // Contador de teclas y navegador. int opcionB = 0; // Capturar tecla para luego validar. ConsoleKey teclaOpcionB; while (true) { switch (opcionB) { case 0: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B. "); Console.SetCursorPosition(0, 1); Console.WriteLine("> SubOpción B-1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" SubOpción B-2 "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 1: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" SubOpción B-1. "); Console.SetCursorPosition(0, 2); Console.WriteLine("> SubOpción B-2 "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 2: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" SubOpción B-1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" SubOpción B-2 "); Console.SetCursorPosition(0, 3); Console.WriteLine("> Salir. "); break; default: Console.Write("Fuera de rango. "); break; } // Leer tecla ingresada por el usuario. teclaOpcionB = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (teclaOpcionB == ConsoleKey.Enter) { switch (opcionB) { case 0: OpcionB1(); break; case 1: OpcionB2(); break; case 2: MenuOpciones(); break; default: Console.Write("Fuera de rango. "); break; } } if (teclaOpcionB == ConsoleKey.DownArrow) { opcionB++; } if (teclaOpcionB == ConsoleKey.UpArrow) { opcionB--; } // Si está en la última opción, salta a la primera. if (opcionB > 2) { opcionB = 0; } // Si está en la primera posición, salta a la última. if (opcionB < 0) { opcionB = 2; } } } #endregion #region Opcion B-1. public static void OpcionB1() { ConsoleKey teclaOpcionB1; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B-1."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para "); Console.SetCursorPosition(0, 3); Console.WriteLine("volver atrás. "); // Almacena el teclado pulsado en la variable teclaSubMenuA. teclaOpcionB1 = Console.ReadKey(true).Key; } while (teclaOpcionB1 != ConsoleKey.Enter); } #endregion #region Opcion B-2. public static void OpcionB2() { ConsoleKey teclaOpcionB2; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B-2."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para "); Console.SetCursorPosition(0, 3); Console.WriteLine("volver atrás. "); // Almacena el teclado pulsado en la variable teclaSubMenuA. teclaOpcionB2 = Console.ReadKey(true).Key; } while (teclaOpcionB2 != ConsoleKey.Enter); } #endregion #region Opción C (2). public static void OpcionC() { // Contador de teclas y navegador. int opcionC = 0; // Capturar tecla para luego validar. ConsoleKey teclaOpcionC; Console.Clear(); while(true) { switch (opcionC) { case 0: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C. "); Console.SetCursorPosition(0, 1); Console.WriteLine("> Color 1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 2. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Opción C-1. "); break; case 1: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 1. "); Console.SetCursorPosition(0, 2); Console.WriteLine("> Color 2. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Opción C-1. "); break; case 2: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 2. "); Console.SetCursorPosition(0, 3); Console.WriteLine("> Opción C-1. "); break; case 3: Console.SetCursorPosition(0, 0); Console.WriteLine("> Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 4: Console.SetCursorPosition(0, 0); Console.WriteLine(" Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine("> Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 5: Console.SetCursorPosition(0, 0); Console.WriteLine(" Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine("> Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 6: Console.SetCursorPosition(0, 0); Console.WriteLine(" Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine("> Salir. "); break; default: Console.Write("Fuera de rango. "); break; } // Leer tecla ingresada por el usuario. teclaOpcionC = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (teclaOpcionC == ConsoleKey.Enter) { switch (opcionC) { case 0: // Fondo azul. Console.BackgroundColor = ConsoleColor.Blue; // Letras blancas. Console.ForegroundColor = ConsoleColor.White; break; case 1: // Fondo verde. Console.BackgroundColor = ConsoleColor.Green; // Letras negras. Console.ForegroundColor = ConsoleColor.Black; break; case 2: OpcionC1(); break; case 3: // Fondo negro. Console.BackgroundColor = ConsoleColor.Black; // Letras rojo. Console.ForegroundColor = ConsoleColor.Red; break; case 4: // Fondo negro. Console.BackgroundColor = ConsoleColor.Black; // Letras rojo. Console.ForegroundColor = ConsoleColor.Yellow; break; case 5: // Fondo negro. Console.BackgroundColor = ConsoleColor.Red; // Letras rojo. Console.ForegroundColor = ConsoleColor.DarkRed; break; case 6: MenuOpciones(); break; default: Console.Write("Fuera de rango. "); break; } } if (teclaOpcionC == ConsoleKey.DownArrow) { opcionC++; } if (teclaOpcionC == ConsoleKey.UpArrow) { opcionC--; } // Si está en la última opción, salta a la primera. if (opcionC > 6) { opcionC = 0; } // Si está en la primera posición, salta a la última. if (opcionC < 0) { opcionC = 6; } } } #endregion #region OpcionC-1. public static void OpcionC1() { // Contador de teclas y navegador. int opcionC1 = 0; // Capturar tecla para luego validar. ConsoleKey teclaOpcionC1; Console.Clear(); while(true) { Console.Clear(); switch (opcionC1) { case 0: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C-1."); Console.SetCursorPosition(0, 2); Console.WriteLine(" SI"); Console.SetCursorPosition(16, 2); Console.WriteLine("> NO"); break; case 1: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C-1."); Console.SetCursorPosition(0, 2); Console.WriteLine("> SI"); Console.SetCursorPosition(16, 2); Console.WriteLine(" NO"); break; default: Console.Write("Fuera de rango. "); break; } // Leer tecla ingresada por el usuario. teclaOpcionC1 = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (teclaOpcionC1 == ConsoleKey.Enter) { switch (opcionC1) { case 0: MenuPrincipal(); Console.Clear(); break; case 1: OpcionSI(); break; default: Console.Write("Fuera de rango. "); break; } } // Flecha derecha. if (teclaOpcionC1 == ConsoleKey.RightArrow) { opcionC1++; } // Flecha izquierda. if (teclaOpcionC1 == ConsoleKey.LeftArrow) { opcionC1--; } // Si está en la última opción, salta a la primera. if (opcionC1 > 1) { opcionC1 = 0; } // Si está en la primera posición, salta a la última. if (opcionC1 < 0) { opcionC1 = 1; } } } #endregion #region opcionSI del sub menú C-1. public static void OpcionSI() { ConsoleKey teclaOpcionB1; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción SÍ."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para "); Console.SetCursorPosition(0, 3); Console.WriteLine("volver atrás. "); // Almacena el teclado pulsado en la variable teclaOpciónB1. teclaOpcionB1 = Console.ReadKey(true).Key; } while (teclaOpcionB1 != ConsoleKey.Enter); } #endregion } }
Se que se podrá hacer mucho mejor y sin fallos como estos. No se quedará así, sino que mi idea principal, es coger el truco que se pueda crear menús y submenús que se pueda hacer de forma muy sencilla.
Dejo clarqo eu solo hacerlo que funcione con botones flecha arriba, abajo, derecha, izquierda y Enter (Escape solo para salir si estás en la ventana principal).
Saludos.