Консольные приложения .NET, можно создавать метки и регионы?

2

Можно ли выводить текст приложения консоли С# на уже нанесенные метки? Я видел некоторые собственные консольные приложения, которые могут это сделать.

Таким образом, на экране пользователь видит:

Прогресс: 1% или прогресс: 50% в зависимости от того, когда метка обновлена ​​(и прогресс метки остается в том же месте, в то время как обновляется только процентная доля прогресса.

Вместо того, чтобы я знаю, как это сделать в настоящее время, это console.writeLine, который будет создавать отдельную строку для каждого обновления Progress.

EG:

Прогресс: 1%

Прогресс: 2%

  • 0
    «Назад в день», мы должны были бы выводить символы возврата на одну позицию, чтобы переместить курсор назад после метки «Progress:». На более интересном терминале мы бы использовали escape-последовательности для позиционирования курсора.
Теги:

4 ответа

9
Лучший ответ

Да, вы можете это сделать.

Вы можете использовать Console.SetCursorPosition, чтобы переместить курсор после записи.

Например:

Console.WriteLine("Starting algorithm...");

int line = Console.CursorTop;
for (int i=0;i<100;++i)
{
    Console.SetCursorPosition(0,line);
    Console.Write("Progress is {0}%        ",i);  // Pad with spaces to make sure we cover old text
    Thread.Sleep(100);
}
Console.SetCursorPosition(0,line);    
Console.WriteLine("Algorithm Complete.       "); // Pad with spaces to make sure we cover old text
1

Посмотрите Console.SetCursorPosition

0

Хотя я уже принял ответ: вот динамический пример для следующего парня:

private static List<screenLocation> screenLocationsBasic = new List<screenLocation>();

public class screenLocation
{
    public int Left { get; set; }
    public int Top { get; set; }

    public screenLocation(int left, int top)
    {
        this.Left = left;
        this.Top = top; 
    }


}

Затем во время фазы рисования шаблона вы можете добавлять динамические элементы в зависимости от количества элементов в вашем цикле:

screenLocationsBasic.Add(new screenLocation(Console.CursorLeft , Console.CursorTop ));

Затем во время обработки данных вы можете обновить только это местоположение в зависимости от того, с каким предметом вы имеете дело:

Console.SetCursorPosition(screenLocationsBoth[pos].Left, screenLocationsBoth[pos].Top);

Затем вам нужно всего лишь передать pos (позиция элемента в вашем цикле).

-1

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

  • 1
    Почему бы не использовать планировщик заданий Windows для запуска нового экземпляра консольного приложения каждые 10 миллисекунд или около того? </ PILING ON>
  • 0
    Для анонима -1, быстрее машина получится :)
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню