在软件开发中,向导界面是一种常见的用户交互方式,它通过一系列步骤引导用户完成任务。本文将介绍如何使用一个名为SimpleWizard的框架来创建一个简单且易于使用的向导界面。SimpleWizard已经被移到了GitHub上,任何仍然觉得它有用的人都可以下载使用。只需点击本文顶部的新下载链接即可。
创建向导页面的第一步是定义一个接口,该接口规定了向导页面必须实现的方法和属性。以下是C#语言中定义的IWizardPage接口的示例:
public interface IWizardPage
{
UserControl Content { get; }
void Load();
void Save();
void Cancel();
bool IsBusy { get; }
bool PageValid { get; }
string ValidationMessage { get; }
}
这个接口定义了向导页面需要实现的基本方法和属性。只需要创建一些用户控件(即页面),继承IWizardPage接口,就可以开始实现向导页面了。
在向导中,页面的集合和导航是核心功能。以下是C#语言中定义的WizardPageCollection类和导航逻辑的示例:
public enum WizardPageLocation
{
Start,
Middle,
End
}
public class WizardPageCollection : Dictionary
{
public IWizardPage CurrentPage { get; private set; }
public IWizardPage FirstPage { get; }
public IWizardPage LastPage { get; }
public WizardPageLocation PageLocation { get; private set; }
public bool CanMoveNext { get; }
public bool CanMovePrevious { get; }
public WizardPageCollection()
{
PageLocation = WizardPageLocation.Start;
}
public IWizardPage MovePageFirst()
{
// 实现逻辑...
}
public IWizardPage MovePageLast()
{
// 实现逻辑...
}
public IWizardPage MovePageNext()
{
// 实现逻辑...
}
public IWizardPage MovePagePrevious()
{
// 实现逻辑...
}
public int IndexOf(IWizardPage wizardPage)
{
// 实现逻辑...
}
public void Reset()
{
// 实现逻辑...
}
private void NotifyPageChanged(int previousPageIndex)
{
// 实现逻辑...
}
}
public class WizardPageLocationChangedEventArgs
{
public WizardPageLocation PageLocation { get; set; }
public int PageIndex { get; set; }
public int PreviousPageIndex { get; set; }
}
在这个类中,定义了页面集合的导航逻辑,包括移动到第一页、最后一页、下一页和上一页的方法。此外,还有一些属性可以直接访问集合中的当前页面、第一页和最后一页,以及一些属性可以告诉是否可以向前或向后移动,而方法则允许实际在页面之间移动(如果可能的话)。
向导宿主是向导界面的核心,它负责显示页面、处理导航和验证。以下是C#语言中定义的WizardHost类的示例:
public partial class WizardHost : Form
{
private const string VALIDATION_MESSAGE = "Current page is not valid. Please fill in required information.";
public WizardPageCollection WizardPages { get; set; }
public bool ShowFirstButton { get; set; }
public bool ShowLastButton { get; set; }
public bool NavigationEnabled { get; set; }
public WizardHost()
{
InitializeComponent();
WizardPages = new WizardPageCollection();
WizardPages.WizardPageLocationChanged += WizardPages_WizardPageLocationChanged;
}
void WizardPages_WizardPageLocationChanged(WizardPageLocationChangedEventArgs e)
{
LoadNextPage(e.PageIndex, e.PreviousPageIndex, true);
}
private void NotifyWizardCompleted()
{
// 实现逻辑...
}
private void OnWizardCompleted()
{
// 实现逻辑...
}
public void UpdateNavigation()
{
// 实现逻辑...
}
private bool CheckPageIsValid()
{
// 实现逻辑...
}
public void LoadWizard()
{
// 实现逻辑...
}
public void LoadNextPage(int pageIndex, int previousPageIndex, bool savePreviousPage)
{
// 实现逻辑...
}
private void btnFirst_Click(object sender, EventArgs e)
{
// 实现逻辑...
}
private void btnPrevious_Click(object sender, EventArgs e)
{
// 实现逻辑...
}
private void btnNext_Click(object sender, EventArgs e)
{
// 实现逻辑...
}
private void btnLast_Click(object sender, EventArgs e)
{
// 实现逻辑...
}
}
在这个类中,定义了向导页面集合,一些属性来选择是否显示向导的第一页和最后一页的按钮(显示下一页和上一页的按钮是有意义的,这就是为什么只有两个属性)。所有的导航更新和检查当前页面是否有效的操作都在这里进行。CheckPageIsValid()方法调用IWizardPage的PageValid属性。如果它返回false,则会显示一个消息框,以及页面的ValidationMessage属性。
当准备好开始向导时,只需要添加向导页面并显示向导宿主作为对话框。以下是C#语言中的一个示例:
private void button1_Click(object sender, EventArgs e)
{
WizardHost host = new WizardHost();
host.Text = "My Wizard";
host.WizardCompleted += host_WizardCompleted;
host.WizardPages.Add(1, new Page1());
host.WizardPages.Add(2, new Page2());
host.WizardPages.Add(3, new Page3());
host.LoadWizard();
host.ShowDialog();
}
这个示例展示了如何创建一个向导宿主,添加页面,并显示它。