我正在寻找一种有效的方法来实现Windows窗体应用程序的日志窗口.在过去,我已经使用TextBox和RichTextBox实现了几个,但我仍然不完全满意这个功能.
此日志旨在向用户提供各种事件的近期历史记录,主要用于数据收集应用程序,其中可能会对特定事务的完成方式感到好奇.在这种情况下,日志不必是永久性的,也不必保存到文件中.
首先,一些提出的要求:
到目前为止我一直用来编写和修剪日志:
我使用以下代码(我从其他线程调用):
// 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 …Run Code Online (Sandbox Code Playgroud) 我想要的只是更新ListViewItem的文本,而不会看到任何闪烁.
这是我的更新代码(多次调用):
listView.BeginUpdate();
listViewItem.SubItems[0].Text = state.ToString(); // update the state
listViewItem.SubItems[1].Text = progress.ToString(); // update the progress
listView.EndUpdate();
Run Code Online (Sandbox Code Playgroud)
我见过一些涉及覆盖组件的解决方案 WndProc():
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WM.WM_ERASEBKGND)
{
m.Msg = (int)IntPtr.Zero;
}
base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)
他们说这解决了问题,但在我的情况下却没有.我相信这是因为我在每个项目上使用图标.
我正在尝试使用 ListBox 播放列表构建一个简单的音乐播放器。将音频文件添加到播放列表时,它首先用文件名填充列表框,然后(在单独的线程上)提取 ID3 数据并用正确的艺术家 - 标题信息(很像 Winamp)覆盖文件名。
但是当 ListBox 正在更新时,它是不可滚动的,因为它总是在每个项目覆盖时跳转到顶部。
有什么办法可以防止这种情况吗?
编辑:
代码:
public Form1()
{
//Some initialization code omitted here
BindingList<TAG_INFO> trackList = new BindingList<TAG_INFO>();
// The Playlist
this.playlist = new System.Windows.Forms.ListBox();
this.playlist.Location = new System.Drawing.Point(12, 12);
this.playlist.Name = "playlist";
this.playlist.Size = new System.Drawing.Size(229, 316);
this.playlist.DataSource = trackList;
}
private void playlist_add_Click(object sender, EventArgs e)
{
//Initialize OpenFileDialog
OpenFileDialog opd = new OpenFileDialog();
opd.Filter = "Music (*.WAV; *.MP3; *.FLAC)|*.WAV;*.MP3;*.FLAC|All files (*.*)|*.*";
opd.Title = "Select Music";
opd.Multiselect = true; …Run Code Online (Sandbox Code Playgroud) 我有一个继承的列表视图,当我点击列标题时有明显的闪烁.列表在详细信息视图中.
public ListViewEx()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
this.DoubleBuffered = true;
}
int sortColumn = -1;
protected override void OnColumnClick(ColumnClickEventArgs e)
{
if(e.Column != sortColumn)
{
sortColumn = e.Column;
this.Sorting = SortOrder.Ascending;
}
else
{
if(this.Sorting == SortOrder.Ascending)
this.Sorting = SortOrder.Descending;
else
this.Sorting = SortOrder.Ascending;
}
this.Sort();
}
Run Code Online (Sandbox Code Playgroud)
填充列表时没有闪烁.
for(int i = 0; i < 10; i++)
{
ListViewItem lvi = new ListViewItem("this is column 1 " +i);
lvi.SubItems.Add("...
lvi.SubItems.Add("...
lvi.SubItems.Add("...
lvi.SubItems.Add("...
lvi.SubItems.Add("...
listViewEx1.Items .Add (lvi);
}
Run Code Online (Sandbox Code Playgroud)
编辑WM_ERASEBKGND并没有解决我的问题. …