1

我发现的所有互联网资源都声称,WinForms实现这一目标的唯一可能性是创建自己的UserControl(例如:herehereherehere)。

WinForms是否可以仅使用提供的控件来实现这一点?

4

1 回答 1

6

是的,有可能:

  • 为列表中的每个项目创建一个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)的图像在哪里(当然,每个都有自己的分配)。progressBarImageListprogressBarListViewItemProgressBar

关键是将相同的图像再次分配到相同的位置ImageList- 这会导致重新绘制,没有它就不起作用。

优点:快速(不必自己编写UserControl)、便宜(对此进行了很多调查,但最终编写的代码不多),并且可以工作

缺点:当有大量项目时,我注意到一些闪烁。此外,Mono 上还有一些令人耳目一新的问题。

示例结果: 在此处输入图像描述

带有示例应用程序的代码:https ://github.com/bartoszkp/dotrl (BSD 许可证) - 特别是参见BatchExperimentWindow课程:https ://github.com/bartoszkp/dotrl/blob/master/Application/BatchExperimentWindow.cs

于 2013-09-15T11:30:34.157 回答