Изящное окно журнала в WinForms C#

Я ищу идеи об эффективном способе реализовать окно журнала для приложения форм окон. В прошлом я реализовал несколько использований TextBox и RichTextBox, но я все еще не полностью удовлетворен функциональностью.

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

Во-первых, некоторые предложенные требования:

  • Эффективный и быстрый; если сотни строк записаны в журнал в быстрой последовательности, он должен использовать минимальные ресурсы и время.
  • Будьте в состоянии предложить переменную scrollback до 2 000 строк или около этого. Что-либо дольше является ненужным.
  • Выделение и цвет предпочтено. Эффекты шрифта, не требуемые.
  • Автоматически строки для обрезки как предел scrollback достигнуты.
  • Автоматически прокрутите, поскольку добавляются новые данные.
  • Премия, но не требуемый: Пауза, автопрокручивающая во время ручного взаимодействия такой, как будто пользователь просматривает историю.

Что я использовал до сих пор, чтобы записать и обрезать журнал:

Я использую следующий код (который я называю от других потоков):

// rtbLog is a RichTextBox
// _MaxLines is an int
public void AppendLog(string s, Color c, bool bNewLine)
{
    if (rtbLog.InvokeRequired)
    {
        object[] args = { s, c, bNewLine };
        rtbLog.Invoke(new AppendLogDel(AppendLog), args);
        return;
    }
    try
    {
        rtbLog.SelectionColor = c;
        rtbLog.AppendText(s);
        if (bNewLine) rtbLog.AppendText(Environment.NewLine);
        TrimLog();
        rtbLog.SelectionStart = rtbLog.TextLength;
        rtbLog.ScrollToCaret();
        rtbLog.Update();
    }
    catch (Exception exc)
    {
        // exception handling
    }
}

private void TrimLog()
{
    try
    {
        // Extra lines as buffer to save time
        if (rtbLog.Lines.Length < _MaxLines + 10)
        {
            return;
        }
        else
        {
            string[] sTemp = rtxtLog.Lines;
            string[] sNew= new string[_MaxLines];
            int iLineOffset = sTemp.Length - _MaxLines;
            for (int n = 0; n < _MaxLines; n++)
            {
                sNew[n] = sTemp[iLineOffset];
                iLineOffset++;
            }
            rtbLog.Lines = sNew;
        }
    }
    catch (Exception exc)
    {
        // exception handling
    }
}

Проблема с этим подходом состоит в том, что каждый раз, когда TrimLog называют, я теряю цветное форматирование. С обычным TextBox это работает просто великолепно (с небольшим количеством модификации, конечно).

Поиски решения этого никогда не были действительно удовлетворительными. Некоторые предлагают обрезать избыток счетчиком символов вместо количества строки в RichTextBox. Я также видел используемый ListBoxes, но успешно не попробовал его.

56
задан JYelton 3 February 2010 в 22:46
поделиться

4 ответа

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

Затем напишите небольшой код, который необходим для сброса этой коллекции в различные элементы пользовательского интерфейса. Лично я бы поместил методы SendToEditControl и SendToListBox в свой объект протоколирования. Вероятно, я бы добавил возможности фильтрации в эти методы.

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

Важно не привязывать ваш журнал к части пользовательского интерфейса, это ошибка. Когда-нибудь вы захотите работать без головы.

В конечном счете, хороший пользовательский интерфейс для логгера, вероятно, это пользовательский контроль. Но в краткосрочной перспективе, вы просто хотите отключить протоколирование от любого специфического пользовательского интерфейса.

26
ответ дан 26 November 2019 в 17:27
поделиться

Расширение позволяет различать библиотеку и .dll. Но вы различаете библиотеку импорта и статическую библиотеку по имени файла , а не по расширению.

Не будет случая, когда существует библиотека импорта для набора кода, который был построен как статическая библиотека, или когда существует статическая библиотека для DLL. Это две разные вещи.

Не существует единого соглашения о стандартных именах файлов MSVC. Как правило, имя библиотеки, оканчивающееся на «D», часто является отладочным построением библиотечного кода, msvcrtd.dll vs msvcrt.dll , но за исключением этого, стандартов нет.

-121--2959452-

Я бы сказал, что ListView идеально подходит для этого (в режиме подробного просмотра), и именно для этого я использую его в нескольких внутренних приложениях.

Полезный наконечник: используйте BeginUpdate () и EndUpdate (), если вы знаете, что будете добавлять/удалять много предметы одновременно.

-121--1010642-

Если требуется выделение и форматирование цвета, я бы предложил RichTextBox.

Если требуется автоматическая прокрутка, используйте ListBox.

В любом случае свяжите его с кольцевым буфером строк.

2
ответ дан 26 November 2019 в 17:27
поделиться

Я недавно реализовал нечто подобное. Наш подход заключался в том, чтобы сохранить кольцевой буфер записей обратной прокрутки и просто нарисовать текст журнала вручную (с помощью Graphics.DrawString). Затем, если пользователь хочет прокрутить назад, скопировать текст и т. Д., У нас есть кнопка «Пауза», которая переключает обратно на обычный элемент управления TextBox.

5
ответ дан 26 November 2019 в 17:27
поделиться

Я бы сказал, что ListView идеально подходит для этого (в режиме детального просмотра), и именно для этого я использую его в нескольких внутренних приложениях.

Полезный совет: используйте BeginUpdate () и EndUpdate (), если вы знаете, что будете добавлять / удалять много элементов одновременно.

5
ответ дан 26 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: