如何在 Windows Mobile 应用程序中实现向导表单?

8

我对Windows Mobile(使用C#和紧凑型框架)开发还有点陌生,所以我不太确定该如何做。用户必须按照向导的方式通过若干信息页面。在开始时有一个登录窗口。

我该怎么实现?我只需要为每个页面创建不同的用户控件,并在需要时创建/显示和销毁/隐藏它们吗?还是我需要创建不同的表单并以某种方式显示那些表单?

编辑(来自不同于OP的用户)

由于我也没有找到一个好的解决方案,而且一些答案中的链接在Windows Mobile 6.5中无法使用,因此我开始了一项悬赏活动

这些看起来很有前途,但不能为移动6.5构建

http://weblogs.asp.net/justin_rogers/articles/117859.aspx

http://www.codeproject.com/KB/dialog/WizardForm.aspx

http://www.codeproject.com/KB/miscctrl/DesignTimeWizard.aspx

http://winformswizard.codeplex.com/

http://www.differentpla.net/content/2005/02/implementing-wizard-c(与上面相同,但更早的作品)


WinForms向导的其他资源在这里:http://stackoverflow.com/questions/2084048/creating-wizards-for-win-forms-in-c - BillW
你找到了好的向导解决方案吗?我也在寻找这个功能,当我发现CodePlex源代码(Roger Lipscombe的代码)不能用于移动应用程序时,我感到失望。 - Tim
3个回答

6
我会使用TabControl来“模拟”一个向导(请注意,我个人没有在Windows Mobile/Compact Framework上使用过TabControl,但它被微软正式列为“Windows CE、Windows Mobile for Pocket PC”框架的一部分。请参阅:TabControl)。
在WinForms中,如果你想创建类似向导的用户体验,有一个简单的技巧可以隐藏选项卡:在窗体的“Load”事件中,将TabControl的区域设置为TabControl的DisplayRectangle。
tabControl1.Region = new Region(tabControl1.DisplayRectangle);

如果这对您有用,它将为您节省大量移动“UserControls”或“Panels”的麻烦,并且您可以在设计时以可视化模式设计您的TabPage,然后以您认为最好的方式从TabPage导航到TabPage。
如果您想要恢复选项卡以查看,请在窗体“Load”事件中“快照”TabControl的原始区域。
以下是一种快速示例方法:一种“单向”从头到尾的模型:
定义一个字典,其中每个键都是一个TabPage,每个键条目的布尔值控制是否允许用户导航到该TabPage。
// allocate the Dictionary
Dictionary<TabPage, bool> CanNavigateDict = new Dictionary<TabPage, bool>();

您需要在表单加载事件中执行以下操作来“准备该字典”:

foreach (TabPage theTPage in tabControl1.TabPages)
{
    CanNavigateDict.Add(theTPage, false); 
}

// show the first TabPage
tabControl1.SelectedTab = tabPage1;

在这个模型中,导航控制意味着您需要将下一个TabPage的布尔值设置为“true”,当您通过任何方式满足当前页面完成的标准时:示例。
// sample of how you control navigation in the TabControl
// by using the CanNavigate Dictionary in the TabControl 'Selecting event
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
  e.Cancel = ! CanNavigateDict[e.TabPage];
}

3

我会强烈倾向于使用DI/IoC容器来实现这一点(具体来说,我会使用this one,但几乎任何一个都可以工作)。

我会创建一个主窗体MainForm,它是应用程序的“宿主”。在该MainForm上,我会放置一个DeckWorkspace或TabWorkspace,取决于您希望用户如何导航。如果您只想允许前进/后退,我会选择deckworkspace。如果他们被允许跳过几个步骤,则TabWorkspace可能更合适。

然后,我会在MainForm上添加几个按钮作为导航按钮。

然后,我会为向导页面中的每个SmartPart(视图)创建一个。在引擎盖下,这些是UserControls,但它们是Wor4kspaces知道如何使用的内容。

然后,我会创建一个WizardService,其中包含状态机,用于导航的有效内容以及在前进/后退时显示哪些SmartParts等。

然后,我会为每个SmartPart创建Presenter,将Views与WizardService连接起来,或者只为整个内容创建单个Presenter。这将大大取决于向导数据的复杂性以及从步骤到步骤的数据关系。

接下来,我将为导航按钮连接事件。这些事件将到达WizardService,该服务将处理确定我们需要导航到哪里并联系Presenter,而Presenter则会显示和填充适当的视图。

编辑

我已经制作了一个在WinMo/WEH上运行的Wizard的实例。相同的代码也可以在Windows CE甚至桌面上正常工作。请查看我的博客以获取一些解释,或直接从Codeplex项目更改集中获取代码。


1

你是说一个有很多控件被隐藏/移动的表单更容易吗? - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接