Иногда надо отображать пользователю ход процесса, т.е., что в данный момент наша программа делает. Лучше всего, на мой взгляд, для такого подходит компонент ListView
.
В него будем писать лог наших действий. Замутим тестовое приложение:
— Создадим форму с ListView
и кнопкой «Начать»
— По нажатию кнопки «Начать» запустим отдельный поток, который будет выводить нам числа от 1 до 100, и генерировать событие.
В коде или в конструкторе установим основные опции для ListView
. Нам нужно, чтобы он отображал все, как список. Ну так, как выводится лог в консоль. Устанавливаем соответствующие свойства:
View = Details
Теперь идем в конструктор, ищем опцию Columns
, и добавляем единственную колонку:
В появившемся окне все удаляем из поля Text
, жмем OK, смотрим на размер (Size
) ListWiev
, возвращаемся в редактирование колонок, и правим свойство Width
. Устанавливаем чуть меньше, чем размер самого ListWiev
.
Отладили, посмотрели чтоб было красиво? Ставим
HeaderStyle = None
(чтоб не отображался заголовок колонки, заголовки были убраны).
Несмотря на то, что все действия происходят в отдельном потоке, ListView
дергается и дрожит:
Для этого делаем новый контрол, наследник от
ListView
и в коде нового класса подправляем параметр отображения:
class MyListView:ListView { public MyListView() { this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); } }
Используем новый контрол вместо ListView
. Ничего не дрожит и не дергается.
При добавлении нового элемента:
Достаточно при добавлении в ListView
устанавливать свойство TopItem
в значение последнего элемента. Тогда у ListView
появится автоматическая прокрутка:
lvOut.TopItem = lvOut.Items[lvOut.Items.Count - 1]
;
Pingback: C#, перехват вывода консольной программы в реальном времени из собственного приложения. | Персональный блог Толика Панкова