相关文章推荐
沉稳的脆皮肠  ·  linux: ...·  昨天    · 
会开车的小马驹  ·  datatable的dom配置 - ...·  15 小时前    · 
爱笑的西红柿  ·  警告warning: strncpy ...·  1 周前    · 
谈吐大方的花卷  ·  2013 BizTalk ...·  1 年前    · 
2 { 3 public string Id { get; set; } 4 public string StepName { get; set; } 5 public int StepOrder { get; set; } 6 public eumStepState StepState { get; set; } 7 public string StepDesc { get; set; } 8 public object StepTag { get; set; } 9 //public Image StepCompletedImage { get; set; } 10 //public Image StepDoingImage { get; set; } 11 public StepEntity(string id,string stepname,int steporder,string stepdesc, eumStepState stepstate,object tag) 12 { 13 this.Id = id; 14 this.StepName = stepname; 15 this.StepOrder = steporder; 16 this.StepDesc = stepdesc; 17 this.StepTag = tag; 18 this.StepState = stepstate; 19 } 20 }

定义一个名为StepViewer 的用户控件。

1 public partial class StepViewer : UserControl
3         public StepViewer()
4         {
5             InitializeComponent();
6             this.Height = 68;
7         }

在StepViewer 的用户控件中定义一个ListDataSource的属性,如下:

 1   private List<StepEntity> _dataSourceList = null;
 2         [Browsable(true), Category("StepViewer")]
 3         public List<StepEntity> ListDataSource
 4         {
 5             get
 6             {
 7                 return _dataSourceList;
 8             }
 9             set
10             {
11                 if (_dataSourceList != value)
12                 {
13                     _dataSourceList = value;
14                     Invalidate();
15                 }
16             }
17         }

在此控件的paint方法中,进行步骤条的绘制:

  1  private void StepViewer_Paint(object sender, PaintEventArgs e)
  2         {
  3             if(this.ListDataSource!=null)
  4             {
  5                 int CenterY = this.Height / 2;
  6                 int index = 1;
  7                 int count = ListDataSource.Count;
  8                 int lineWidth = 120;
  9                 int StepNodeWH = 28;
 10                 //this.Width = 32 * count + lineWidth * (count - 1) + 6+300;
 11                 //defalut pen & brush
 12                 e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 13                 Brush brush = new SolidBrush(_Gray);
 14                 Pen p = new Pen(brush, 1f);
 15                 Brush brushNode = new SolidBrush(_DarkGray);
 16                 Pen penNode = new Pen(brushNode, 1f);
 18                 Brush brushNodeCompleted = new SolidBrush(_Blue);
 19                 Pen penNodeCompleted = new Pen(brushNodeCompleted, 1f);
 22                 int initX = 6;
 23                 //string
 24                 Font nFont = new Font("微软雅黑", 12);
 25                 Font stepFont = new Font("微软雅黑", 11,FontStyle.Bold);
 26                 int NodeNameWidth = 0;
 28                 foreach (var item in ListDataSource)
 29                 {
 31                     //round
 33                     Rectangle rec = new Rectangle(initX, CenterY - StepNodeWH / 2, StepNodeWH, StepNodeWH);
 34                     if (CurrentStep == item.StepOrder)
 35                     {
 36                         if (item.StepState == eumStepState.OutTime)
 37                         {
 38                             e.Graphics.DrawEllipse(new Pen(_Red,1f), rec);
 39                             e.Graphics.FillEllipse(new SolidBrush(_Red), rec);
 40                         }
 41                         else
 42                         {
 43                             e.Graphics.DrawEllipse(penNodeCompleted, rec);
 44                             e.Graphics.FillEllipse(brushNodeCompleted, rec);
 45                         }
 47                         //白色字体
 48                         SizeF fTitle = e.Graphics.MeasureString(index.ToString(), stepFont);
 49                         Point pTitle = new Point(initX + StepNodeWH / 2 - (int)Math.Round(fTitle.Width) / 2, CenterY - (int)Math.Round(fTitle.Height / 2));
 50                         e.Graphics.DrawString(index.ToString(), stepFont, Brushes.White, pTitle);
 53                         //nodeName
 54                         SizeF sNode = e.Graphics.MeasureString(item.StepName, nFont);
 55                         Point pNode = new Point(initX + StepNodeWH, CenterY - (int)Math.Round(sNode.Height / 2) + 2);
 57                         e.Graphics.DrawString(item.StepName,new Font( nFont,FontStyle.Bold), brushNode, pNode);
 58                         NodeNameWidth = (int)Math.Round(sNode.Width);
 59                         if (index < count)
 60                         {
 61                             e.Graphics.DrawLine(p, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY);
 62                         }
 64                     }
 65                     else if (item.StepOrder < CurrentStep)
 66                     {
 67                         //completed
 68                         e.Graphics.DrawEllipse(penNodeCompleted, rec);
 69                         //image
 70                         RectangleF recRF = new RectangleF(rec.X + 6, rec.Y + 6, rec.Width - 12, rec.Height - 12);
 71                         e.Graphics.DrawImage(ControlsResource.check_lightblue, recRF);
 73                         //nodeName
 74                         SizeF sNode = e.Graphics.MeasureString(item.StepName, nFont);
 75                         Point pNode = new Point(initX + StepNodeWH, CenterY - (int)Math.Round(sNode.Height / 2) + 2);
 76                         e.Graphics.DrawString(item.StepName, nFont, brushNode, pNode);
 77                         NodeNameWidth = (int)Math.Round(sNode.Width);
 79                         if (index < count)
 80                         {
 81                             e.Graphics.DrawLine(penNodeCompleted, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY);
 82                         }
 84                     }
 85                     else
 86                     {
 87                         e.Graphics.DrawEllipse(p, rec);
 88                         //
 89                         SizeF fTitle = e.Graphics.MeasureString(index.ToString(), stepFont);
 90                         Point pTitle = new Point(initX + StepNodeWH / 2 - (int)Math.Round(fTitle.Width) / 2, CenterY - (int)Math.Round(fTitle.Height / 2));
 91                         e.Graphics.DrawString(index.ToString(), stepFont, brush, pTitle);
 92                         //nodeName
 93                         SizeF sNode = e.Graphics.MeasureString(item.StepName, nFont);
 94                         Point pNode = new Point(initX + StepNodeWH, CenterY - (int)Math.Round(sNode.Height / 2) + 2);
 95                         e.Graphics.DrawString(item.StepName, nFont, brushNode, pNode);
 96                         NodeNameWidth = (int)Math.Round(sNode.Width);
 97                         if (index < count)
 98                         {
 99                             //line
100                             e.Graphics.DrawLine(p, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY);
101                         }
102                     }
104                     //描述信息
105                     if (item.StepDesc != "")
106                     {
107                         Point pNode = new Point(initX + StepNodeWH, CenterY+10);
108                         e.Graphics.DrawString(item.StepDesc,new Font(nFont.FontFamily,10),brush, pNode);
109                     }
113                     index++;
114                     //8 is space width
115                     initX = initX + lineWidth + StepNodeWH+ NodeNameWidth+8;
116                 }
117             }
118         }

控件的使用:

1  List<StepEntity> list = new List<StepEntity>();
2  list.Add(new StepEntity("1", "新开单", 1, "这里是该步骤的描述信息", eumStepState.Completed, null));
4  list.Add(new StepEntity("2", "主管审批", 2, "这里是该步骤的描述信息", eumStepState.Waiting, null));
5  list.Add(new StepEntity("3", "总经理审批", 3, "这里是该步骤的描述信息", eumStepState.OutTime, null));
6  list.Add(new StepEntity("2", "完成", 4, "这里是该步骤的描述信息", eumStepState.Waiting, null));
8  this.stepViewer1.CurrentStep = 3;
9  this.stepViewer1.ListDataSource = list;
作者:Leo_wl
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。