Winform中创建导航窗口:WizardFramework使用

https://www.cnblogs.com/daxnet/p/4612509.html

首先在NuGet中下载WizardFramework:

创建向导页

创建多个用户控件,然后使其都继承于WizardFramework.WizardPage类。此时,Visual Studio编辑器会提示构造函数错误,因为WizardPage类型没有可访问的默认构造函数,这就需要通过自定义的向导页类的构造函数向基类传入参数。以下是WizardPage构造函数的重载,以及各重载构造函数的参数描述。

  • WizardPage(string title, string description, Wizard wizard, IWizardModel model = null)
    • title:用于显示在每个向导页上方黑体标题部分的标题信息
    • description:用于显示在每个向导页上方的向导页描述信息
    • wizard:当前向导页所在的向导对象,一般通过向导页的构造函数参数传入
    • model:当前向导页所使用的数据对象模型
  • WizardPage(string title, string description, Wizard wizard, WizardPageType type)
    • title:用于显示在每个向导页上方黑体标题部分的标题信息
    • description:用于显示在每个向导页上方的向导页描述信息
    • wizard:当前向导页所在的向导对象,一般通过向导页的构造函数参数传入
    • type:当前向导页的类型。分为两种类型:Standard和Expanded。Standard类型的意思是,当显示该向导页时,会在向导对话框的上方显示title和description信息;而对于Expanded类型,则这部分信息不会显示出来,整个页面的设计完全由开发人员自己控制。显然,在上面的示例中,2、3、4、5页都是属于Standard类型的向导页,而1和6页则属于Expanded类型
  • WizardPage(string title, string description, Wizard wizard, IWizardModel model, WizardPageType type)
    • title:用于显示在每个向导页上方黑体标题部分的标题信息
    • description:用于显示在每个向导页上方的向导页描述信息
    • wizard:当前向导页所在的向导对象,一般通过向导页的构造函数参数传入
    • model:当前向导页所使用的数据对象模型
    • type:当前向导页的类型。分为两种类型:Standard和Expanded。Standard类型的意思是,当显示该向导页时,会在向导对话框的上方显示title和description信息;而对于Expanded类型,则这部分信息不会显示出来,整个页面的设计完全由开发人员自己控制。显然,在上面的示例中,2、3、4、5页都是属于Standard类型的向导页,而1和6页则属于Expanded类型

例如:

public partial class First : WizardPage
{
    public First(Wizard wizard) :
        base("Frist", "This is the First page", wizard)
    {
        InitializeComponent();
    }
}

效果:

如果不想要上面那一栏,则在构造函数内添加WizardPageType.Expanded

public partial class First : WizardPage
{
    public First(Wizard wizard) :
        base("Frist", "This is the First page", wizard, WizardPageType.Expanded)
    {
        InitializeComponent();
    }
}

效果:

控制向导的导航

在有些场景下,需要根据当前页的某些界面设置,来决定下一页应该导航到哪个向导页。比如,在向导页1中,如果用户点击了某个复选框,那么当用户再点“下一步”按钮时,则跳过页面2,直接进入页面3,否则,则需要跳到页面2。此时,可以调用Wizard对象的SetPageDisplay方法即可。该方法有两个重载:

  • void SetPageDisplay(int pageIndex, WizardPageDisplay display)
    • pageIndex:根据向导页加入到向导对话框的顺序,所对应的向导页索引号
    • display:指定该页是显示(WizardPageDisplay.Show)还是不显示(WizardPageDisplay.Hide)
  • void SetPageDisplay<T>(WizardPageDisplay display)
    • 泛型类型T:指定需要设置显示行为的向导页类型
    • display:指定该页是显示(WizardPageDisplay.Show)还是不显示(WizardPageDisplay.Hide
public partial class First : WizardPage
{
    public First(Wizard wizard) :
        base("Frist", "This is the First page", wizard, WizardPageType.Expanded)
    {
        InitializeComponent();
        Welcome.wizard = wizard;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Welcome.wizard.SetPageDisplay(1, WizardPageDisplay.Hide);
    }
}

这里几个向导页的wizard对象都是相同的,都是指向Welcome页,这里采用的是在Welcome后台代码中创建一个public static Wizard wizard全局变量来调用函数。点击按钮后,第二页向导页“Second”会被隐藏。

操作属性相关

在WizardPageBase类里有几个bool类型属性:

CanGoCancel 是否当前页能点击取消按钮
CanGoFinishPage 是否当前页能点击完成按钮
CanGoNextPage 是否当前页能点击下一步按钮
CanGoPreviousPage 是否当前页能点击上一步按钮

向导页中的几个回调函数

在WizardFramework.WizardPage基类中,定义了一些可供Wizard对象调用的回调函数,这些函数将在适当的时候被调用,因此,开发人员可以在这些回调函数中处理自己的逻辑,比如设置是否允许用户点击“下一页”等导航按钮。

Task ExecuteShowAsync(IWizardPage fromPage)

当Wizard准备显示当前向导页时,调用此方法。该方法以异步方式调用

fromPage参数:表示是从哪个向导页导航过来的。比如,当用户点击“下一页”按钮后,下一个向导页将会显示在向导对话框中,通常情况下,fromPage参数是所显示的向导页的上一页。

例如在第二页中添加:

        protected override Task ExecuteShowAsync(IWizardPage fromPage)
        {
            MessageBox.Show("在进入页面前显示此对话框");
            return base.ExecuteShowAsync(fromPage);
        }

就会在点击下一步后进入第二页前显示对话框。

Task<bool> ExecuteBeforeGoingPreviousAsync()

当用户点击“上一页”按钮后,向导对话框准备进入上一向导页时,调用此方法。该方法以异步方式调用

返回值:返回一个能够返回布尔值的任务对象,此布尔值表示是否真的允许向导对话框进入上一页(True=允许;False=不允许)

例如在第二页中添加:

protected override Task<bool> ExecuteBeforeGoingPreviousAsync()
{
    MessageBox.Show("显示此对话框");
    return base.ExecuteBeforeGoingPreviousAsync();
}

在第二页点击上一步时会出现对话框。

Task<bool> ExecuteBeforeGoingNextAsync()

当用户点击“下一页”按钮后,向导对话框准备进入下一向导页时,调用此方法。该方法以异步方式调用

返回值:返回一个能够返回布尔值的任务对象,此布尔值表示是否真的允许向导对话框进入下一页(True=允许;False=不允许)

例如在第二页中添加:

protected override Task<bool> ExecuteBeforeGoingNextAsync()
{
    MessageBox.Show("显示此对话框");
    return base.ExecuteBeforeGoingNextAsync();
}

在第二页点击下一步时就会出现对话框。

Task<bool> ExecuteBeforeGoingFinishAsync()

当用户点击“完成”按钮后,向导对话框准备进入“完成”向导页时,调用此方法。该方法以异步方式调用

返回值:返回一个能够返回布尔值的任务对象,此布尔值表示是否真的允许向导对话框结束,并向调用方返回DialogResult.OK值(True=允许;False=不允许)

和上面类似。

void PersistValuesToModel()

当向导对话框准备进入其它向导页时,会调用此方法,将当前已显示的向导页界面上的用户设置保存到向导数据模型对象中。

这个我暂时没用,我用一个类放静态变量了。

System.Windows.Forms.Control FocusingControl

设置在打开当前向导页时,焦点(Focus)所在的界面控件(即焦点默认应该在哪个控件上)

System.Drawing.Image Logo

设置当前向导页需要显示在向导对话框右上角的图标

开发人员在自定义自己的向导页面时,可以在子类中重载以上方法或属性,以在不同的时机处理不同的逻辑。

例如在第二页中:

        // 从文件加载
        private Image Image;

        public Second(Wizard wizard) :
                    base("Second Page", "This is the Second page.", wizard)
        {
            InitializeComponent();
            string currentPath = Environment.CurrentDirectory;
            string PicPath = Directory.GetParent(Directory.GetParent(currentPath).FullName).FullName + "\\start.png";
            Image = Image.FromFile($"{PicPath}");
        }

        protected override System.Drawing.Image Logo
        {
            get
            {
                return Image;
            }
        }
    }
}

初始化向导页

新建一个System.Windows.Forms.Form类型,然后使其继承于WizardFramework.Wizard类即可,无需再写更多的代码。当然,如果需要设置一些额外的属性,也可以直接在Visual Studio的属性页中进行设置即可。

public partial class Form1 : Form
{
    public Welcome welcome = new Welcome();

    public Form1()
    {
        InitializeComponent();
        welcome.Add(welcome.CreatePage<First>());
        welcome.Add(welcome.CreatePage<Second>());
    }

    private void button1_Click(object sender, EventArgs e)
    {
        welcome.Show();
    }
}

但目前有个问题:点击完成或取消按钮后,welcome对象会被释放掉,导致再次点击会报错。

posted @ 2024-06-27 11:51  时而有风  阅读(21)  评论(0编辑  收藏  举报