WPF RichTextBox как текстовая очередь для ведения журнала - PullRequest
3 голосов
/ 06 октября 2011

Я хотел бы использовать элемент управления RichTextBox WPF для печати выходных данных журнала, но мне интересно, каков наиболее эффективный способ удаления «самых старых» строк после того, как, например, отображается более 10000 строк, если это возможно фактически реализует поведение очереди, тем более что нет простого свойства «Text», с которым можно играть.

К сожалению, я не могу достичь этого результата с nlog либо , вероятно, из-за ошибки или ограничения .

Ответы [ 2 ]

5 голосов
/ 06 октября 2011

Вы можете использовать Queue<string> для хранения сообщений журнала и отображения их с помощью свойства RichTextBox.Lines.

Например:

    private const int _maxCapacity = 10000;

    private Queue<string> _messageQueue = new Queue<string>(_maxCapacity);

    private void button1_Click(object sender, EventArgs e)
    {
        if (_messageQueue.Count >= _maxCapacity)
        {
            _messageQueue.Dequeue();
        }

        _messageQueue.Enqueue("message " + _count++.ToString());

        richTextBox1.Lines = _messageQueue.ToArray();
    }

Если вы хотите, чтобы самые последние сообщения появлялись сверху, переверните очередь:

richTextBox1.Lines = _messageQueue.Reverse().ToArray();
3 голосов
/ 10 октября 2011

Если вы расширяете исходный элемент управления с помощью свойства LineCount int, его можно использовать (на основании некоторого кода, указанного здесь ):

if (this.MaxLines > 0)
{
    this.lineCount++;
    if (this.lineCount > this.MaxLines)
    {
        tr = new TextRange(rtbx.Document.ContentStart, rtbx.Document.ContentEnd);
        tr.Text = tr.Text.Remove(0, tr.Text.IndexOf('\n'));
        this.lineCount--;
    }
}

//And for auto scrolling
if (this.AutoScroll)
{
    rtbx.ScrollToEnd();
}
...