问题描述
我有一个名为 SegmentedProgressBar
的自定义用户控件,用于显示属于多线程下载的线程的进度。我需要在 Devexpress
GridControl
中使用。但我不知道该怎么做,在我的谷歌搜索中找不到任何明确的资源。如果有人能提供帮助,我将不胜感激。
我使用 Bar
数组和 ContentLength
来显示进度。 ContentLength 是远程源中文件的总长度。 Bar
类包含 2 个属性:部分下载的总长度和起始偏移量。
class SegmentedProgressBar : ProgressBar
{
public SegmentedProgressBar()
{
ContentLength = 100;
bars = new Bar[] { };
Size = new Size(100,20);
SetStyle(ControlStyles.DoubleBuffer,true);
SetStyle(ControlStyles.UserPaint,true);
SetStyle(ControlStyles.AllPaintingInWmPaint,true);
this.SizeChanged += SegmentedProgressBar_SizeChanged;
}
void SegmentedProgressBar_SizeChanged(object sender,EventArgs e)
{
Invalidate();
}
public override Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
var grp = e.Graphics;
step = Width * 1f / contentLength;
foreach (var br in bars.Where(x=>x.Length > 0))
{
var x = br.Start * step;
var rectF = new RectangleF(x,br.Length * step,Height);
grp.FillRectangle(Brushes.Blue,rectF);
}
base.OnPaint(e);
}
private long contentLength;
private float step;
private Bar[] bars;
public Bar[] Bars
{
get { return bars; }
set
{
bars = value;
foreach (var element in bars)
{
element.PropertyChanged += element_PropertyChanged;
}
Invalidate();
}
}
public long ContentLength
{
get { return contentLength; }
set
{
contentLength = value;
step = Width * 1f / contentLength;
Invalidate();
}
}
private void element_PropertyChanged(object sender,EventArgs e)
{
Invalidate();
}
}
class Bar : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Bar(long length,long start)
{
this.length = length;
this.start = start;
}
private long length;
private long start;
public long Start
{
get { return start; }
set
{
var noteq = value != start;
length = value;
if (noteq && PropertyChanged != null)
PropertyChanged(this,null);
}
}
public long Length
{
get { return length; }
set
{
var noteq = value != length;
length = value;
if (noteq && PropertyChanged != null)
PropertyChanged(this,null);
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)