Базовый интерфейс консоли C # с таймером - PullRequest
1 голос
/ 04 июля 2019

Я делаю основное консольное приложение (к сожалению, это необходимо), которое показывает время и очень простой интерфейс, где пользователь может ввести опцию.Когда они это сделают, пользовательский интерфейс обновляется с соответствующими новыми данными для отображения и позволяет дальнейший ввод и так далее.Все это время в верхней части отображаются живые часы с секундами.

В основном я перерисовываю весь пользовательский интерфейс каждую секунду и пытаюсь прослушать вводимые пользователем данные, чтобы определить, как пользовательский интерфейс отображается в следующий раз.вокруг.Как мне управлять пользовательским вводом при перерисовке интерфейса?Есть ли лучший способ?

Вот целая (очень урезанная версия) программы:

using System;
using System.Diagnostics;
using System.Timers;

namespace TimerTest
{
    class Program
    {
        static bool useStartUI = false;
        static string currentInput = "";
        static Timer aTimer = new System.Timers.Timer();
        static void Main(string[] args)
        {
            aTimer.Elapsed += new ElapsedEventHandler(DrawUI);
            aTimer.Interval = 1000;
            aTimer.Enabled = true;
            Console.ReadLine();
            currentInput = Console.ReadLine();
        }
        static void DrawUI(object source, ElapsedEventArgs e)
        {
            Debug.WriteLine("currentInput = " + currentInput);
            if (currentInput == "A")
            {
                useStartUI = true;
            } else
            {
                useStartUI = false;
            }
            if (!useStartUI)
            {
                DisplayStartUI();
            }
            else
            {
                DisplayCurrentUI();
            }
        }
        private static void DisplayStartUI()
        {
            Console.Clear();
            Console.WriteLine("DisplayStartUI - " +     DateTime.Now.ToString("HH:mm:ss tt"));
            Console.WriteLine("Press 'B' to switch to CurrentUI");
            Console.ReadLine();
            currentInput = Console.ReadLine();
        }
        private static void DisplayCurrentUI()
        {
            Console.Clear();
            Console.WriteLine("DisplayCurrentUI - " +     DateTime.Now.ToString("HH:mm:ss tt"));
            Console.WriteLine("Press 'A' to switch to StartUI");
            Console.ReadLine();
            currentInput = Console.ReadLine();
        }
    }
}

На данный момент у меня есть Console.ReadLine(); сразу после срабатывания таймера,если нет, то приложение открывается и закрывается сразу.Два других Console.ReadLine(); полностью игнорируются, но именно в этих точках я ожидал, что пользовательский ввод будет записан.

1 Ответ

0 голосов
/ 04 июля 2019

Кажется, я обдумал это, и @elgonzo указал мне правильное направление.Теперь я просто отображаю таймер на одной строке и очищаю другие строки по мере необходимости.У меня есть основной рабочий пример, в который я расширю свою основную программу.Похоже, он делает именно то, что мне нужно (очевидно, отсутствует проверка и функциональность), пожалуйста, прокомментируйте, если это можно улучшить:

using System;
using System.Diagnostics;
using System.Timers;

namespace TimerTest
{
    class Program
    {
        static bool appOpen = true;
        static bool useStartUI = false;
        static string currentInput = "";
        static Timer aTimer = new System.Timers.Timer();
        static void Main(string[] args)
        {
            Console.WriteLine("Main - " + DateTime.Now.ToString("HH:mm:ss tt"));
            aTimer.Elapsed += new ElapsedEventHandler(DrawClock);
            aTimer.Interval = 1000;
            aTimer.Enabled = true;

            while (appOpen) // to keep the application running and give a possible exit - will expand this
            {
                DrawUI();
            }
        }
        #region UI region
        static void DrawClock(object source, ElapsedEventArgs e)
        {
            Console.SetCursorPosition(0, 0);
            Console.WriteLine("DrawClock - " + DateTime.Now.ToString("HH:mm:ss     tt"));
            Console.SetCursorPosition(0, 7);
        }
        static void DrawUI()
        {
            Debug.WriteLine("currentInput = " + currentInput);
            if (currentInput == "A" || currentInput == "a")
            {
                useStartUI = true;
            }
            else if (currentInput == "B" || currentInput == "b")
            {
                useStartUI = false;
            }
            if (useStartUI)
            {
                DisplayStartUI();
            }
            else
            {
                DisplayCurrentUI();
            }
        }
        private static void DisplayStartUI()
        {
            CleanUI();
            Console.WriteLine("DisplayStartUI");
            Console.WriteLine("Press 'B' to switch to CurrentUI");

            ConsoleKeyInfo keyPressed = Console.ReadKey();
            Console.SetCursorPosition(0, 7);
            Console.WriteLine("You pressed {0}", keyPressed.KeyChar);
            currentInput = keyPressed.KeyChar.ToString();
            if (keyPressed.KeyChar.ToString() == "b")
            {
                DrawUI();
            }
        }
        private static void DisplayCurrentUI()
        {
            CleanUI();
            Console.WriteLine("DisplayCurrentUI");
            Console.WriteLine("Press 'A' to switch to StartUI");
            ConsoleKeyInfo keyPressed = Console.ReadKey();
            Console.SetCursorPosition(0, 7);
            Console.WriteLine("You pressed {0}", keyPressed.KeyChar);
            currentInput = keyPressed.KeyChar.ToString();
            if (keyPressed.KeyChar.ToString() == "a")
            {
                DrawUI();
            }
        }
        #endregion
        #region functional methods
        public static void CleanUI()
        {
            Console.SetCursorPosition(0, 5);
            ClearCurrentConsoleLine();
            Console.SetCursorPosition(0, 6);
            ClearCurrentConsoleLine();
            Console.SetCursorPosition(0, 7);
            ClearCurrentConsoleLine();
            Console.SetCursorPosition(0, 5);
        }
        public static void ClearCurrentConsoleLine()
        {
            int currentLineCursor = Console.CursorTop;
            Console.SetCursorPosition(0, Console.CursorTop);
            Console.Write(new string(' ', Console.WindowWidth));
            Console.SetCursorPosition(0, currentLineCursor);
        }
        #endregion
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...