当前位置: 首页 > news >正文

WinForm 下的 Wizard(向导) 控件, 提供设计时支持!

前段时间做ASP.NET项目,发现里面的Wizard控件挺好用。后来在一个WinForm项目中也想用到类似的控件,却发现WinForm下并没有提供类似控件,上网搜索了一把,也没发现合意的,无奈之下,只有自己动手,丰衣足食!



要达到WebForm下Wizard控件的相似效果,关键的部分设计基本一样,各关键部分如下:

1. enum WizardStepType   //向导的类型
2. class WizardStep      //单步向导
3. class WizardStepCollection    //向导集合
4. class WizardDesigner   //提供设计时支持的向导类
5. class Wizard           //主要的向导类


首先是WizardStepType的定义,这个与WebForm下的基本一样:

     public   enum  WizardStepType
    
{
        Start,
        Step,
        Finish,
        Complete
    }



接着是WizardStep的定义,它的关键成员有以下几个:
1) bool AllowNext      //是否允许向导跳到下一步
2) bool isLocked       //向导是否处于锁定状态
3) WizardStepType StepType    //向导类型
4) Cancel, Previous,Next,Finish Button    //向导基本按钮

着重要介绍的是 向导基本按钮的实现:

         private   void  InitStepButtons()
        
{
            CancelButton.Text 
= "Cancel";
            CancelButton.Size 
= new Size(9434);
            CancelButton.Location 
= new Point(30, Height - 30 - CancelButton.Height);
            CancelButton.FlatStyle 
= FlatStyle.System;
            CancelButton.Click 
+= CancelButton_Click;

            FinishButton.Text 
= "Finish";
            FinishButton.Size 
= new Size(9434);
            FinishButton.Location 
= new Point(Width - 30 - FinishButton.Width, Height - 30 - FinishButton.Height);
            FinishButton.FlatStyle 
= FlatStyle.System;
            FinishButton.Click 
+= FinishButton_Click;

            NextButton.Text 
= "Next >";
            NextButton.Size 
= new Size(9434);
            NextButton.Location 
= new Point(FinishButton.Location.X - 30 - NextButton.Width, Height - 30 - FinishButton.Height);
            NextButton.FlatStyle 
= FlatStyle.System;
            NextButton.Click 
+= NextButton_Click;

            PreviousButton.Text 
= "< Previous";
            PreviousButton.Size 
= new Size(9434);
            PreviousButton.Location 
= new Point(NextButton.Location.X - 30 - PreviousButton.Width, Height - 30 - FinishButton.Height);
            PreviousButton.FlatStyle 
= FlatStyle.System;
            PreviousButton.Click 
+= PreviousButton_Click;

            Controls.Add(PreviousButton);
            Controls.Add(NextButton);
            Controls.Add(FinishButton);
            Controls.Add(CancelButton);
        }


        
private   void  DrawWizardButton(WizardStepType steptype)
        
{
            
switch(steptype)
            
{
                
case WizardStepType.Start:
                    
{
                        PreviousButton.Enabled 
= false;
                        NextButton.Enabled 
= true;
                        FinishButton.Enabled 
= false;
                        CancelButton.Enabled 
= true;
                    }

                    
break;
                
case WizardStepType.Step:
                    
{
                        PreviousButton.Enabled 
= true;
                        NextButton.Enabled 
= true;
                        FinishButton.Enabled 
= false;
                        CancelButton.Enabled 
= true;
                    }

                    
break;
                
case WizardStepType.Finish :
                    
{
                        PreviousButton.Enabled 
= true;
                        NextButton.Enabled 
= false;
                        FinishButton.Enabled 
= true;
                        CancelButton.Enabled 
= true;
                    }

                    
break;
                
case WizardStepType.Complete :
                    
{
                        PreviousButton.Enabled 
= false;
                        NextButton.Enabled 
= false;
                        FinishButton.Enabled 
= true;
                        CancelButton.Enabled 
= true;
                    }

                    
break;
            }

        }


        
protected   override   void  OnResize(EventArgs eventargs)
        
{
            
base.OnResize(eventargs);

            CancelButton.Location 
= new Point(30, Height - 30 - CancelButton.Height);
            FinishButton.Location 
= new Point(Width - 30 - FinishButton.Width, Height - 30 - FinishButton.Height);
            NextButton.Location 
= new Point(FinishButton.Location.X - 30 - NextButton.Width, Height - 30 - FinishButton.Height);
            PreviousButton.Location 
= new Point(NextButton.Location.X - 30 - PreviousButton.Width, Height - 30 - FinishButton.Height);
        }


        
public   delegate   void  CancelButtonEventHandler( object  sender, EventArgs e);
        
public   delegate   void  PreviousButtonEventHandler( object  sender, EventArgs e);
        
public   delegate   void  NextButtonEventHandler( object  sender, EventArgs e);
        
public   delegate   void  FinishButtonEventHandler( object  sender, EventArgs e);

        
public   event  CancelButtonEventHandler OnCancelButtonClick;
        
public   event  PreviousButtonEventHandler OnPreviousButtonClick;
        
public   event  NextButtonEventHandler OnNextButtonClick;
        
public   event  FinishButtonEventHandler OnFinishButtonClick;

        
private   void  CancelButton_Click( object  sender, EventArgs e)
        
{
            OnCancelButtonClick.Invoke(sender,e);
        }


        
private   void  PreviousButton_Click( object  sender,EventArgs e)
        
{
            OnPreviousButtonClick.Invoke(sender, e);
        }


        
private   void  NextButton_Click( object  sender, EventArgs e)
        
{
            
if(AllowNext)
                OnNextButtonClick.Invoke(sender, e);
        }


        
private   void  FinishButton_Click( object  sender, EventArgs e)
        
{
            OnFinishButtonClick.Invoke(sender, e);
        }

在使用控件的时候,记得要为使用的 基本向导按钮 添加 EventHandler, 否则会提示空引用错误。


WizardStepCollection 就是一个普通的集合类,主要是方便对向导中各个步骤的处理。


Wizard 继承于 UserControl, 比较重要的成员是:
1)int ActivateStep                //当前向导步骤的Index
2)WizardStep ActivateWizardStep   //当前步骤

这两个成员控制了向导步骤的跳转。

WizardDesigner 为 Wizard 提供设计时支持,类似 TabControl 控件一样,具体请看源代码。


以下是使用中的Wizard 控件:







虽然这个控件比较简单,但至少满足了我的需要,希望也能给大家带来帮助!

控件不完美的地方很多,希望大家积极提出批评和建议,小弟虚心接受!


源代码下载:/Files/XiaoFaye/WinForm.Wizard.zip

转载于:https://www.cnblogs.com/XiaoFaye/archive/2007/11/02/946777.html

相关文章:

  • Logback手冊 Chapter 1: Introduction
  • [转]使用控件的RenderControl()方法导出Excel
  • 在移动端禁用长按选中文本功能
  • TNS-01190: The user is not authorized to execute the requested listener command
  • http://book.chinaz.com/database/sqlanywhere/ulcpzh9/ulcpzh9.htm
  • 基于Excel参数化你的Selenium2测试-xlrd
  • min-height和height
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 问题解答
  • 华为机试题-字符串分隔
  • 微软轻量级“代码生成器”—Repository Factory使用(下)
  • 《关于组织申报2017年度高新技术企业的通知》
  • 狼的故事11:以牙还牙
  • sql server 排序规则
  • windows server上联系人和用户的区别
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • iOS | NSProxy
  • java2019面试题北京
  • Java深入 - 深入理解Java集合
  • Java小白进阶笔记(3)-初级面向对象
  • Laravel5.4 Queues队列学习
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何利用MongoDB打造TOP榜小程序
  • 网页视频流m3u8/ts视频下载
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 译有关态射的一切
  • - 转 Ext2.0 form使用实例
  • FaaS 的简单实践
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #stm32整理(一)flash读写
  • (03)光刻——半导体电路的绘制
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (十)c52学习之旅-定时器实验
  • (四)Controller接口控制器详解(三)
  • (五)c52学习之旅-静态数码管
  • (一)WLAN定义和基本架构转
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (轉)JSON.stringify 语法实例讲解
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Remoting学习笔记(三)信道
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET使用存储过程实现对数据库的增删改查
  • .net中应用SQL缓存(实例使用)