C#开发step步骤条控件
来源:互联网 发布:python sorted key 编辑:程序博客网 时间:2024/06/01 11:09
现在很多的javascript控件,非常的不错,其中step就是一个,如下图所示:
那么如何用C#来实现一个step控件呢?
先定义一个StepEntity类来存储步骤条节点的信息:
1 public class StepEntity 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 : UserControl2 {3 public StepViewer()4 {5 InitializeComponent();6 this.Height = 68;7 }8 }
在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 set10 {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); 17 18 Brush brushNodeCompleted = new SolidBrush(_Blue); 19 Pen penNodeCompleted = new Pen(brushNodeCompleted, 1f); 20 21 22 int initX = 6; 23 //string 24 Font nFont = new Font("微软雅黑", 12); 25 Font stepFont = new Font("微软雅黑", 11,FontStyle.Bold); 26 int NodeNameWidth = 0; 27 28 foreach (var item in ListDataSource) 29 { 30 31 //round 32 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 } 46 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); 51 52 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); 56 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 } 63 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); 72 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); 78 79 if (index < count) 80 { 81 e.Graphics.DrawLine(penNodeCompleted, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY); 82 } 83 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 //line100 e.Graphics.DrawLine(p, initX + StepNodeWH + NodeNameWidth, CenterY, initX + StepNodeWH + NodeNameWidth + lineWidth, CenterY);101 }102 }103 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 }110 111 112 113 index++;114 //8 is space width115 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));3 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));7 8 this.stepViewer1.CurrentStep = 3;9 this.stepViewer1.ListDataSource = list;
同样的,我们可以实现如下的timeline控件。
0 0
- C#开发step步骤条控件
- C#开发step步骤条控件
- 步骤条的实现原理及AliceUI中步骤条Step的应用
- 开发c#插件步骤
- VB开发ActiveX控件步骤
- 开发自定义控件的步骤
- Spring的开发步骤(7条)
- C#开发157条建议
- 自己开发c# 控件
- c# 开发winform控件
- c# 开发winform控件
- C#开发ActiveX控件
- C# ActiveX控件开发
- C# 自定义控件开发
- C#开发ActiveX控件
- C#开发Word控件
- C# 面板控件与滚动条
- C# 带滚动条的Label控件
- gunicorn分析 基于 tag0.2
- Android的线程和线程池
- CentOS 添加环境变量的三种方法
- 欢迎使用CSDN-markdown编辑器
- python numpy
- C#开发step步骤条控件
- SpringBoot+Shiro学习之自定义拦截器管理在线用户(踢出用户)
- 图论概念:Degree Centrality 和 Betweenness Centrality
- hdu2675二分解方程
- android studio 2.3 编译运行运行SDL 2.05 Demo
- 图像滤波去噪分析及其应用,code全共享
- Linux系统分区过程
- Java的socket编程
- 2017.3.5 yveh测试