Лучший подход к выводу скользящего журнала Windows Forms в TextBox

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

Есть идеи по поводу лучшего элемента управления для создания окна скользящего журнала в Windows Forms?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
31
0
37 387
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

Я тоже сделал то же самое. В зависимости от вашего порядка сортировки (последняя вставка вверху или внизу) вы также можете выделить последнюю строку

faulty 21.12.2008 07:52

Мне нужно было сделать это некоторое время назад, и 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();
         }
     }

Как правило, при прокрутке журналов я предпочитаю держать самые свежие элементы вверху. Пользователь может быть сбит с толку, если он читает явно статичную строку вверху списка, которая внезапно просто исчезает.

Greg D 08.01.2009 17:51

Была такая же потребность и очень ценила эту помощь. Это немного измененная версия.

Создайте список:

<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/…

Tony O'Hagan 14.02.2013 03:24

очень простое решение

Textbox1.Appendtext(<yourtext>)

для прокрутки журнала как консоль

Проголосовали против. Не удаляет старый текст с помощью этого решения.

Y P 27.05.2014 11:32

Другие вопросы по теме