【问题标题】:How can I implement a Wizard form a Windows Mobile application?如何从 Windows Mobile 应用程序实现向导?
【发布时间】:2011-01-26 21:22:51
【问题描述】:

我对 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 向导的其他资源:stackoverflow.com/questions/2084048/…
  • 您是否为您的向导找到了一个好的解决方案?我也在寻找此功能,但当 codeplex 源(roger Lipscombe 的代码)不适用于移动应用时,我感到很失望。

标签: c# .net windows-mobile compact-framework wizard


【解决方案1】:

我会使用 TabControl 来“模拟”一个向导(请注意,我个人没有在 Windows Mobile/Compact FrameWork 上下文中使用 TabControl,但它被微软正式列为“Windows CE,Windows Mobile for Pocket PC”框架的一部分。参见:TabControl

如果您想创建类似向导的用户体验,在 WinForms 中有一个隐藏选项卡的简单技巧:在 Form 'Load 事件中将 Tabcontrol 的 Region 设置为 TabControl 的 DisplayRectangle。

tabControl1.Region = new Region(tabControl1.DisplayRectangle);

如果这对您有用,它将为您节省大量移动“用户控件”或“面板”的麻烦,并且您可以在设计时以可视模式设计您的 TabPage,然后以任何方式控制从 TabPage 到 TabPage 的导航你认为最好。

如果您想将选项卡恢复到视图中,您可能希望在 Form 'Load 事件中“快照”TabControl 的原始区域。

下面是一个简单的例子:一种“单向”的从头到尾的模型:

定义一个字典,其中每个 Key 都是一个 TabPage,每个 Key 条目的布尔值控制您是否允许用户导航到该 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];
}

【讨论】:

    【解决方案2】:

    我非常倾向于为此使用 DI/IoC 容器(特别是我会使用 this one,但它们中的任何一个都应该可以工作)。

    我会创建一个作为应用程序“主机”的 MainForm。在那个 MainForm 上,我会放置一个 DeckWorkspace 或一个 TabWorkspace,这取决于您希望用户如何导航。如果您只想允许前进/后退,我会选择甲板工作区。如果允许他们跳过几个步骤,那么 TabWorkspace 可能会更有意义。

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

    然后,我将为每个向导页面创建一个 SmartPart(视图)。底层是 UserControls,但它们是 Wor4kspaces 知道如何使用的东西。

    然后,我将创建一个 WizardService,其中包含一个状态机,用于显示对导航有效的内容、为前进/后退显示的 SmartPart 等。

    然后,我会为每个 SmartPart 创建 Presenter,以将 View 连接到 WizardService,或者只为整个事情创建一个 Presenter。这在很大程度上取决于向导数据的复杂性以及各个步骤的数据之间的关系。

    接下来,我将为导航按钮连接事件。这些事件将发送到 WizardService,它负责确定我们需要导航到的位置并联系演示者,然后演示者将显示并填充适当的视图。

    编辑

    我整理了一个在 WinMo/WEH 上运行的向导的可靠工作示例。完全相同的代码在 Windows CE 甚至桌面上都可以正常工作。 See my blog 进行解释或直接从the Codeplex project's changesets 提取代码。

    【讨论】:

      【解决方案3】:

      关于“UserControls”或“Multiple Forms”的选择:

      两者都可以,但 MainForm + UserControls 更容易。

      另见:What's the best way to create a Windows Mobile application with multiple screens in C#

      【讨论】:

      • 您是说一种具有很多隐藏/移动控件的表单更容易吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2011-09-25
      • 2011-04-04
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多