我发现的所有互联网资源都声称,WinForms
实现这一目标的唯一可能性是创建自己的UserControl
(例如:here、here、here和here)。
WinForms
是否可以仅使用提供的控件来实现这一点?
是的,有可能:
ImageList
并添加一个Bitmap
ListView
并将ImageList
上面创建的附加为SmallImageList
ListView
样式设置为Details
ListViewItem
为每列添加带有适当字符串的后续s,并在第一步中创建适当的ImageIndex
引用Bitmap
//...
{
foreach (/*item to add to list*/)
{
Bitmap progressBarBitmap = new Bitmap(
this.imageList.ImageSize.Width,
this.imageList.ImageSize.Height);
this.imageList.Images.Add(progressBarBitmap);
ProgressBar progressBar = new ProgressBar();
progressBar.MinimumSize = this.imageList.ImageSize;
progressBar.MaximumSize = this.imageList.ImageSize;
progressBar.Size = this.imageList.ImageSize;
// probably create also some BackgroundWorker here with information about
// this particular progressBar
ListViewItem lvi = new ListViewItem(
new[] { "column1", ... },
this.listView.Items.Count);
lvi.UseItemStyleForSubItems = true;
this.listView.Items.Add(lvi);
lvi.Tag = /* some convenient info class to refer back to related objects */
}
//...
}
ProgressBar
:
int previousProgress = progressBar.Value;
progressBar.Value = ...
if (progressBar.Value != previousProgress)
{
progressBar.DrawToBitmap(progressBarBitmap, bounds);
progressBarImageList.Images[index] = progressBarBitmap;
}
适当progressBarBitmap
位置 ( index
)的图像在哪里(当然,每个都有自己的分配)。progressBarImageList
progressBar
ListViewItem
ProgressBar
关键是将相同的图像再次分配到相同的位置ImageList
- 这会导致重新绘制,没有它就不起作用。
优点:快速(不必自己编写UserControl
)、便宜(对此进行了很多调查,但最终编写的代码不多),并且可以工作
缺点:当有大量项目时,我注意到一些闪烁。此外,Mono 上还有一些令人耳目一新的问题。
带有示例应用程序的代码:https ://github.com/bartoszkp/dotrl (BSD 许可证) - 特别是参见BatchExperimentWindow
课程:https ://github.com/bartoszkp/dotrl/blob/master/Application/BatchExperimentWindow.cs