我正在寻找一种有效的方法来实现 Windows 窗体应用程序的日志窗口。过去我已经使用 TextBox 和 RichTextBox 实现了几个,但我仍然对功能不完全满意。
此日志旨在为用户提供各种事件的最新历史记录,主要用于数据收集应用程序,在这些应用程序中,人们可能会好奇特定事务是如何完成的。在这种情况下,日志不需要是永久的,也不需要保存到文件中。
首先,提出一些要求:
- 高效、快速;如果快速连续地将数百行写入日志,则需要消耗最少的资源和时间。
- 能够提供最多 2000 行左右的可变回滚。任何更长的时间都是不必要的。
- 突出显示和颜色是首选。不需要字体效果。
- 达到回滚限制时自动修剪行。
- 添加新数据时自动滚动。
- 额外但不是必需的:在手动交互期间暂停自动滚动,例如用户正在浏览历史记录。
到目前为止我一直在使用什么来编写和修剪日志:
我使用以下代码(我从其他线程调用):
// 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 时,我都会丢失颜色格式。对于常规文本框,这工作得很好(当然需要进行一些修改)。
对此问题的解决方案的搜索从未真正令人满意。有些人建议在 RichTextBox 中按字符数而不是行数来修剪多余的部分。我也见过使用ListBoxes,但没有成功尝试过。
我建议您根本不要使用控件作为日志。而是写一个日志收藏具有您想要的属性(不包括显示属性)的类。
然后编写将该集合转储到各种用户界面元素所需的少量代码。就我个人而言,我会放SendToEditControl
and SendToListBox
方法到我的日志记录对象中。我可能会为这些方法添加过滤功能。
您只能在有意义的情况下更新 UI 日志,从而为您提供尽可能最佳的性能,更重要的是,可以让您在日志快速更改时减少 UI 开销。
重要的是不要将日志记录与 UI 部分联系起来,这是一个错误。有一天你可能想无头跑。
从长远来看,一个好的记录器 UI 可能是一个自定义控件。但从短期来看,您只想断开日志记录与任何specific用户界面的一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)