Подтвердить что ты не робот

Лучший подход к выпуску журнала журналов Windows Forms в TextBox

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

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

4b9b3361

Ответ 1

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

Ответ 2

именно то, что мне нужно. Я решил его с помощью следующего кода, который сохраняет видимый последний добавленный элемент:

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

Ответ 3

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

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

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

Ответ 4

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

Textbox1.Appendtext(<yourtext>)

для скользящего журнала, такого как консоль

Ответ 5

Мне нужно было сделать это некоторое время назад, и Listbox был решением. Никто не заметит разницы.