2009-10-12 1 views
2

Возможно ли, чтобы текст вывода консольного приложения C# был уже нарисован? Я видел, как некоторые из них используют 32 консольных приложения, которые могут это сделать..NET Console Applications, можно создавать метки и регионы?

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

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

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

EG:.

Прогресс: 1%

Прогресс: 2%

+0

«Назад в день», мы будем выводить обратные символы, чтобы переместить курсор обратно после метки «Прогресс:». На терминале fancier мы использовали бы escape-последовательности для позиционирования курсора. –

ответ

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

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

+1

Почему бы не использовать Windows Task Scheduler для запуска нового экземпляра вашего консольного приложения каждые 10 миллисекунд или около того? – MusiGenesis

+0

К анонимному -1, получите более быструю машину :) – cjk

+0

@MusiGenesis - Я пишу консольные приложения, которые достаточно быстры, чтобы не нуждаться в обновлении прогресса ... – cjk

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); 

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

Смежные вопросы