• 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

  • 相关阅读:
    Inner Classes with TypeScript
    设计模式(一)
    C++定义构造函数必须使用初始化列表的场合
    制作Linux下程序安装包——使用脚本打包bin、run等安装包
    Windows下将程序打包为安装包(最为简易的方式)
    在Linux中查看文件的编码及对文件进行编码转换
    libpcap文件格式分析
    static_cast, dynamic_cast, const_cast
    字符1与数字1
    Linux下的多线程编程
  • 原文地址:https://www.cnblogs.com/XiaoFaye/p/946777.html
Copyright © 2020-2023  润新知