WPF RichTextBox作为用于记录目的的文本队列

时间:2011-10-06 01:25:41

标签: c# wpf logging queue richtextbox

我想使用RichTextBox WPF控件来打印日志输出,但是我想知道在显示超过10,000行之后删除“最旧”行的最有效方法是什么,如果有可能的话实际上实现了一个队列行为,特别是因为没有简单的“Text”属性可以使用。

很遗憾,我无法使用nlog probably due to a bug or a limitation获得此结果。

2 个答案:

答案 0 :(得分:5)

您可以使用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();

答案 1 :(得分:3)

如果使用LineCount int属性扩展原始控件,则可以使用它(受到here给出的一些代码的启发):

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