В приложении Forms я показываю вывод журнала из долго работающего приложения командной строки, которое генерировало много вывода. Я запускаю программу в фоновом режиме, фиксирую ее вывод и в настоящее время отображаю его в текстовом поле с помощью AppendText. Я предпочитаю отображать, например, только последние 1000 строк. Удаление строк из TextBox обходится дорого, а TextBox на самом деле не кажется лучшим подходом для скользящего отображения журнала.
Есть идеи по поводу лучшего элемента управления для создания окна скользящего журнала в Windows Forms?





Раньше у меня были списки для таких вещей. Вы просто удаляете первую строку, если количество строк достигает, скажем, 1000. Если строка журнала слишком длинная, вы можете немного расширить список (зависит от информации журнала и возможности уловить значение из первой видимой слова без горизонтальной прокрутки) и сделайте горизонтальную полосу прокрутки видимой.
Мне нужно было сделать это некоторое время назад, и Listbox был решением. Никто даже не заметит разницы.
именно то, что мне нужно. Я решил это с помощью следующего кода, который сохраняет последний добавленный элемент видимым:
delegate void UpdateCCNetWindowDelegate(String msg);
private void Message2CCNetOutput(String message)
{
// Check whether the caller must call an invoke method when making method calls to listBoxCCNetOutput because the caller is
// on a different thread than the one the listBoxCCNetOutput control was created on.
if (listBoxCCNetOutput.InvokeRequired)
{
UpdateCCNetWindowDelegate update = new UpdateCCNetWindowDelegate(Message2CCNetOutput);
listBoxCCNetOutput.Invoke(update, message);
}
else
{
listBoxCCNetOutput.Items.Add(message);
if (listBoxCCNetOutput.Items.Count > Program.MaxCCNetOutputLines)
{
listBoxCCNetOutput.Items.RemoveAt(0); // remove first line
}
// Make sure the last item is made visible
listBoxCCNetOutput.SelectedIndex = listBoxCCNetOutput.Items.Count - 1;
listBoxCCNetOutput.ClearSelected();
}
}
Как правило, при прокрутке журналов я предпочитаю держать самые свежие элементы вверху. Пользователь может быть сбит с толку, если он читает явно статичную строку вверху списка, которая внезапно просто исчезает.
Была такая же потребность и очень ценила эту помощь. Это немного измененная версия.
Создайте список:
<ListBox x:Name = "lbLog" Background = "LightGray"></ListBox>
В основном потоке (в начальной части кода) поместите это, чтобы сохранить ссылку на поток пользовательского интерфейса:
Thread m_UIThread;
....
m_UIThread = Thread.CurrentThread;
Тогда это ваш метод журнала, вызываемый из любого потока:
public void AddToLog(String message)
{
if (Thread.CurrentThread != m_UIThread)
{
// Need for invoke if called from a different thread
this.Dispatcher.BeginInvoke(
DispatcherPriority.Normal, (ThreadStart)delegate()
{
AddToLog(message);
});
}
else
{
// add this line at the top of the log
lbLog.Items.Insert(0, message);
// keep only a few lines in the log
while (lbLog.Items.Count > LOG_MAX_LINES)
{
lbLog.Items.RemoveAt(lbLog.Items.Count-1);
}
}
}
Диспетчер отслеживает поток, в котором он был создан, вам не нужен m_UIThread ... поэтому вместо тестирования if (Thread.Current! = M_UIThread) вы можете просто использовать if (! Dispatcher.CheckAccess ()) msdn.microsoft.com/en-us/library/…
очень простое решение
Textbox1.Appendtext(<yourtext>)
для прокрутки журнала как консоль
Проголосовали против. Не удаляет старый текст с помощью этого решения.
Я тоже сделал то же самое. В зависимости от вашего порядка сортировки (последняя вставка вверху или внизу) вы также можете выделить последнюю строку