我发现所有互联网资源都声称,在WinForms
中,实现这一目标的唯一可能性就是创建自己的UserControl
(示例:here,here,{ {3}},here)。
是否可以仅使用提供的WinForms
控件实现此目的?
答案 0 :(得分:5)
是的,有可能:
ImageList
并为其添加Bitmap
ListView
并将上面创建的ImageList
附加为SmallImageList
ListView
样式设置为Details
ListViewItem
,并引用适当的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
当然已经分配了。)
关键是要将同一张图片再次分配到BatchExperimentWindow
中的同一位置 - 这会导致重新绘制,如果没有,则无效。
优点: 快速(不必写自己的{{1}}),便宜(有很多调查要找到这个,但最终写的代码不多),并且有效
缺点: 当有大量物品时,我注意到有些闪烁。此外,Mono还有一些令人耳目一新的问题。
带有示例应用程序的代码:https://github.com/bartoszkp/dotrl(BSD许可证) - 特别是参见{{1}}类:https://github.com/bartoszkp/dotrl/blob/master/Application/BatchExperimentWindow.cs