Windows Mobile 应用开发第三部分:Windows Mobile 设备的 Windows Forms 应用开发基础
学习开发 Windows Mobile 设备上基于 Windows Forms 的应用程序的基础知识。
引言
为 Windows Mobile 设备开发应用程序与为桌面开发应用程序类似,尤其是当您使用 Visual Basic .NET 或 Visual C# 时。您可以使用相同的开发工具来开发应用程序,尽管为 Windows Mobile 设备开发应用程序与为桌面开发应用程序之间存在差异。设备屏幕更小,资源有限,极其便携,并且通常由电池供电。
本文提供了有关如何为 Windows Mobile 设备开发基于 Windows Forms 的应用程序的信息。您将学习如何开发可以利用设备功能、对电池友好并且无论设备显示方向如何都能正确显示的应用程序。
不同设备的窗体因子不同
市面上有大量的 Windows Mobile 设备。这些设备不仅具有不同的窗体因子,还可以运行不同版本的 Windows Mobile 平台。在本文中,我们将重点关注 Windows Mobile 6 设备(包括 Standard 和 Professional)。
Windows Mobile 6 Standard 设备
这些设备以前称为智能手机。所有这些设备都具有电话功能,并且没有触摸屏。它们通常可以单手操作。要为 Windows Mobile 6 Standard 设备开发应用程序,您需要 Windows Mobile 6 Standard SDK 以及 Visual Studio 2005 Professional 或更高版本。
Windows Mobile 6 Professional 设备
这些设备以前称为 Pocket PC。这些设备可能具有电话功能,并且都有触摸屏。它们通常需要双手操作,并结合使用触控笔或手指控制。要为 Windows Mobile 6 Professional 设备开发应用程序,您需要 Windows Mobile 6 Professional SDK 以及 Visual Studio 2005 Professional 或更高版本。
开发者体验
使用 Visual Studio 2008 为桌面和 Windows Mobile 设备开发托管应用程序之间的差异不大。开发者体验是相似的。当您启动 Visual Studio 2008 时,您可以决定要创建哪种类型的项目。一旦确定了项目类型和目标平台,Visual Studio 就会为您创建一个初始项目,并显示一个空白窗体,您可以在其上开始开发您的用户界面。开发 Windows Mobile 设备时最大的区别是有限的屏幕尺寸和各种不同的屏幕尺寸。当您开始将用户界面控件从 Visual Studio 2008 工具箱拖放到窗体上时,就会出现另一个区别。与桌面开发者相比,您会发现可用的用户界面控件数量有限。当您开发 Windows Mobile 6 Standard 应用程序时,开箱即用的用户界面控件数量比开发 Windows Mobile Professional 设备应用程序时更加有限。由于 Windows Mobile 6 Standard 设备没有触摸屏,因此为 Windows Mobile Professional 设备提供的一些控件使用起来没有意义。
为应用程序创建用户界面仅仅意味着将控件从工具箱拖放到窗体或已添加到窗体的容器控件中。当然,您可以在应用程序中创建多个窗体,并且可以创建自己的控件,无论是派生自现有控件,还是从头开始创建控件。除了“简单”的用户界面控件之外,还提供了一系列常用对话框,以帮助您快速入门,并使您的应用程序看起来与其他在 Windows Mobile 设备上运行的应用程序一致。
设计一个简单的 Windows Mobile 6 Professional 用户界面
要开始开发新的设备应用程序,您首先需要在 Visual Studio 2008 中创建一个新项目。该项目应为 C# 或 Visual Basic .NET 的智能设备项目,目标是 Windows Mobile 6 Professional SDK。当您创建新的设备应用程序时,Visual Studio 2008 会显示一个空白窗体,其尺寸适合目标设备,甚至包含设备皮肤,以尽可能接近真实设备。使用图 1 所示的设备控件工具箱,您可以将控件拖放到应用程序的窗体上。
查看您可以用来开发用户界面的各个控件。如果您不熟悉新控件,最好的方法是创建一个简单的应用程序来使用这些新控件,查看它们的属性,并研究它们的行为。当然,您也应该查看有关特定控件的在线帮助。如果您开始设计用户界面,立即引起您注意的是用户界面设计器如何帮助您对齐控件并建议控件之间的最小距离。自动显示指南将极大地帮助您在短时间内创建美观的用户界面。
创建能够正确处理显示方向模式的应用程序
众多具有不同功能和窗体因子的设备使得开发一个针对多个设备的单个应用程序具有一定的挑战性。Visual Studio 将通过提供用户界面控件的停靠和锚定功能来支持您。Windows Mobile 6 SDK 将通过提供有关不同设备功能和操作系统版本号的信息来支持您。在本文中,我们将仅限于创建满足以下要求的基于 Windows Forms 的应用程序:
- 资源和电池友好
- 目标为 Windows Mobile 6 设备
- 在纵向和横向模式以及带有方形屏幕的设备上都能正确显示
尽管 Windows Mobile 6 Standard 设备不使用不同的显示方向模式,但可以想象未来可能会改变。对于某些操作,以横向模式显示信息可以为最终用户提供更好的体验。Visual Studio 2008 将通过允许您停靠和锚定用户界面控件来支持您设计基于 Windows Forms 的用户界面。
停靠和锚定控件
为了确保窗体在纵向和横向模式下都能正确显示,可以将控件停靠和锚定到父控件(如 Form
或 Panel
控件)中的指定位置。停靠和锚定之间存在细微但重要的区别。当您将控件锚定到容器的一个或多个边缘时,可以确保在更改设备的显示方向时,控件与锚定边缘的相对位置保持不变。当您停靠控件时,您指定了控件将对其定位的容器的边缘。您甚至可以指定控件应停靠到所有边缘,这意味着控件将填充父控件的全部可用空间。
为了展示锚定和停靠之间的区别,并展示锚定和停靠控件在不同显示方向下的行为,您可以创建一个简单的 Form
,其中包含多个具有不同背景颜色的 Label
控件,然后您可以直接查看锚定、停靠和方向更改的行为。用户界面的设计并不是特别有意义,但它将帮助您理解停靠和锚定之间的区别。它还将显示从纵向模式更改为横向模式的影响。假设您已创建了如图 3 所示的用户界面。
三个顶部标签托管在一个面板上;两个底部标签托管在窗体本身上。对于添加到窗体上的所有控件,请务必显式删除锚定。Visual Studio 2008 的默认行为是将其所有控件锚定到其托管容器的顶部和左侧边缘。用户界面在纵向模式下看起来不错,但当您将方向更改为横向模式时,您会遇到问题,如图 4 所示。
您可以立即看到,并非所有在纵向模式下显示的标签在横向模式下都可见。面板的一部分,包括顶部标签的一部分,屏幕之外。此外,底部标签已从屏幕上消失,并且在横向模式下,显示器的左右两侧未被填充。看起来横向模式只是显示了纵向模式用户界面的一部分。
要解决此问题而无需编写实际代码,您可以使用停靠和锚定。您可以通过设置 Anchor
属性来简单地将控件锚定到屏幕的一个或多个边缘。锚定控件意味着控件与锚定边缘的相对位置始终相同——独立于显示方向。通过使用 Dock
属性,您可以指定特定控件如何与其父控件的边缘对齐或如何填充屏幕的某个区域。将多个控件停靠到其父控件的同一边缘会导致控件堆叠在一起。在我们的示例中,顶部三个标签都归属于一个面板控件。最上面的标签未停靠,但它锚定到面板控件的左、上、右边缘,而面板控件又停靠在窗体的顶部。无论显示方向如何,左、上、右边缘与标签之间的距离都将相同。当用户界面以横向模式显示时,标签的大小会调整。面板控件中的另外两个标签显示在彼此的顶部;它们都停靠在面板控件的底部。制表符顺序决定了这些标签的显示方式。如果您现在将显示方向更改为横向模式,窗体上的所有控件都将保持可见,并且窗体的整个大小都将用于填充控件,如图 5 所示。
图 5 中显示的用户界面比图 4 中显示的用户界面看起来要好得多,因为各个控件已调整大小以在横向模式下正确显示。要真正感受停靠和锚定如何影响控件在纵向和横向模式下的位置,您应该花一些时间进行实验。
在 Visual Studio 2008 中,非常容易在两种方向模式下查看您的用户界面,甚至在设计器视图中也是如此。要更改设计器视图中的设备方向,只需右键单击设备皮肤。在弹出菜单中,选择向左旋转或向右旋转以更改屏幕显示方向,如图 6 所示。或者,在选择了整个窗体后,您可以使用工具栏按钮来更改方向。
创建可在多个设备上运行的应用程序
如果您创建的应用程序以任何一个 Windows Mobile 6 SDK(Professional 或 Standard)为目标,您可以更改解决方案中的目标平台以针对另一个 SDK。但是,在这种情况下,您的应用程序将被从一个目标转换为另一个目标,这意味着您的应用程序将被 Visual Studio 2008 修改。如果您采用此方法转换最初以 Windows Mobile 6 Professional SDK 为目标的应用程序,可能会遇到一些挑战。由于 Windows Mobile 6 Standard 设备支持的用户界面控件少于 Windows Mobile 6 Professional 设备,因此必须将不受支持的控件转换为替代控件,以便在新的目标平台上构建和运行转换后的应用程序。Visual Studio 2008 将帮助您将项目从一个目标平台转换为另一个目标平台。当然,从软件开发的观点来看,将业务逻辑与用户界面逻辑分离,使目标平台转换尽可能简单是一个好主意。新目标平台上不支持的用户界面控件将由 Visual Studio 2008 窗体设计器标记,允许您将这些控件转换为新目标平台上支持的最接近的匹配项。如果您不想将现有项目转换为另一个平台,可以利用 Visual Form Inheritance 来维护单个代码库,并且仍然有可能在多个平台上运行您的应用程序。
Visual Form Inheritance
Visual Studio 2008 在将一个窗体派生到另一个窗体时为您提供了完整的设计器支持。为了演示 Visual Form Inheritance 的实际应用,让我们从一个简单的基础窗体开始,该窗体可用作以多个 Windows Mobile 平台为目标的应用程序的起点。虽然不是绝对必要,但创建一个单独的类库来保存基础窗体非常有意义。提前考虑基础窗体很重要;您应该知道哪些控件可以在派生窗体中修改,哪些控件不能。要能够修改控件或控件的行为,您必须确保将特定控件的访问修饰符属性设置为“Private”以外的任何值。在图 7 中,您可以看到一个可以作为应用程序起点的简单基础窗体。
基础窗体包含一个停靠以填充屏幕的编辑控件和一个菜单。该应用程序是一个简单的文本编辑器。它可以创建新的文本文件,修改现有的文本文件,并允许重命名和删除文本文件。尽管此应用程序创建的文件是普通的文本文件,但它们具有唯一的扩展名,以便于文件操作。基础窗体是为 Windows Mobile Standard 设备创建的。原因是 Windows Mobile Standard 设备可用的用户界面控件少于 Windows Mobile Professional 设备。为了操作文件,提供两个额外的窗体来显示现有文件列表和重命名现有文件。由于 Windows Mobile Standard 设备没有触摸屏,因此所有文件操作都通过菜单项执行。在本文中,您将不会得到文本编辑器完整源代码的描述。重点将放在创建单个应用程序以针对多个设备。但是,Mobile Edit 示例应用程序可供下载。
在图 8 中,您将看到一个 Windows Mobile Professional 设备的“主窗体”。尽管它看起来不同,但它派生自您已经在图 7 中看到的“主窗体”,并添加了一个仅适用于 Windows Mobile Professional 的用户界面控件——文档列表。尽管主窗体包含一个编辑控件,但在窗体设计器中,它不可见,因为文档列表显示在其之上。在应用程序内部,当不需要文档列表时,它将通过编程方式隐藏。属于基础窗体的控件将在派生窗体中继承。您可以看到它们已被继承,因为它们在其左上角显示一个箭头符号,如菜单控件所示。
由于 Windows Mobile Professional 设备支持其他控件,因此应用程序本身可以更简单,并且可以利用触摸屏功能。利用文档列表来选择和操作文件意味着不需要额外的窗体。由于目标是创建一个可以同时支持 Windows Mobile Standard 和 Windows Mobile Professional 设备的单个二进制文件,因此在应用程序启动期间,我们将确定目标设备类型并显示相应的窗体。正如您在 Program.cs 的以下代码片段中看到的,.NET Compact Framework 3.5 可以轻松确定设备类型。
static void Main()
{
if (SystemSettings.Platform == WinCEPlatform.PocketPC)
{
Application.Run(new MainFormTouch());
}
else if (SystemSettings.Platform == WinCEPlatform.Smartphone)
{
Application.Run(new MainFormNoTouch());
}
}
根据设备类型,我们将使用 MainFormNoTouch
或 MainFormTouch
作为我们应用程序的主窗体。窗体继承的真正强大之处在于我们正在为 Windows Mobile Professional 设备重用主窗体上的功能。例如,如果用户单击“新建”菜单项,无论他们在哪个设备上执行应用程序,MainFormNoTouch
屏幕上定义的“新建”菜单项的事件处理程序都将执行。
protected virtual void menuNew_Click(object sender, EventArgs e)
{
autoSave = false;
if (tbWorkArea.Text.Length != 0)
{
if (MessageBox.Show("Save contents before creating a new file",
"Save current contents",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
EditLogic.WriteFile(fileName, tbWorkArea.Text);
}
tbWorkArea.Text = string.Empty;
}
autoSave = true;
fileName = EditLogic.FileName;
}
此代码负责在打开新文件之前要求用户保存他们正在处理的任何文件。如您所见,编辑器本身的功能可通过另一个名为 EditLogic
的类获得,以将用户界面与应用程序的逻辑完全分离。如果用户运行的是 Windows Mobile Professional 设备,则需要一些附加功能来禁用“文档列表”控件。您可以通过重写 menuNew_Click
事件处理程序来实现这一点,如下面的代码片段所示。
protected override void menuNew_Click(object sender, EventArgs e)
{
base.menuNew_Click(sender, e);
documentList.Visible = false;
MinimizeBox = false;
}
当用户在 Windows Mobile Professional 设备上单击“新建”菜单项时,首先执行基础窗体的代码,然后执行两个仅适用于 Windows Mobile Professional 设备的附加语句。这些语句负责隐藏“文档列表”,从而使派生编辑控件可见,并分别在窗体的标题栏上显示“确定”按钮。
要重写 menuNew_Click
事件处理程序,您需要手动将其添加到 MainFormTouch.cs 源文件中。如果您只是在 Windows Forms 设计器中双击“新建”菜单项,设计器将为您创建一个新的事件处理程序,称为 menuNew_Click_1
。此事件处理程序将在基础窗体中原始 menuNew_Click
事件处理程序执行后被调用。
资源友好型开发
每次应用程序的主窗体(针对两种设备类型)变为不可见时,都会生成一个事件。同样,每次应用程序的主窗体变为可见时,都会生成另一个事件。这些事件可用于释放资源,例如,在应用程序移至后台时禁用计时器。这样,应用程序在不需要时将释放内存,并且还将确保使用尽可能少的处理能力。如果 Mobile Editor 转到后台,它将暂时将编辑会话的内容保存到文件中,并在应用程序再次转到前台时恢复文本框中的内容。以下代码将在应用程序转到后台时执行,以释放文本框 tbWorkArea
的内容。
protected virtual void MainFormNoTouch_Deactivate(object sender, EventArgs e)
{
if (fileName != string.Empty && tbWorkArea.Text.Length != 0)
{
EditLogic.WriteFile(fileName, tbWorkArea.Text);
tbWorkArea.Text = string.Empty;
autoSave = true;
}
}
以下代码将在应用程序回到前台时执行,以恢复文本框 tbWorkArea
的内容。
protected virtual void MainFormNoTouch_Activated(object sender, EventArgs e)
{
if (autoSave)
{
tbWorkArea.Text = EditLogic.ReadFile(fileName);
}
}
创建可在 Windows Mobile Standard 和 Windows Mobile Professional 上正常运行的应用程序是可能的,但您必须考虑应用程序的架构。当您还将不同设备的各种硬件功能考虑在内时,情况会变得更加复杂。这超出了本白皮书的范围。
您现在应该对如何结合使用窗体继承和 Windows Forms 设计器有了很好的了解。当然,您可以将任何控件托管在基础窗体上,只要您想在派生窗体中重用它。只需确保将控件的 Modifiers
属性设置为“Private”以外的任何值(例如 protected
或 public
),如果您想修改派生窗体中特定控件的行为。将 Modifiers
属性设置为 private
以外的任何值,您甚至可以在派生窗体上隐藏、停靠或调整控件的大小。
本系列相关文章
- Windows Mobile 应用开发 第 1 部分:创建您的第一个应用程序
正确安装 VS2008 和 Windows Mobile SDK 以创建您的第一个移动应用程序。www.myrampup.com 的第 1 部分(共 7 部分)。
- Windows Mobile 应用开发第二部分:设备模拟器和设备模拟器管理器
使用设备模拟器和蜂窝模拟器测试您的应用程序。
- Windows Mobile 应用开发第四部分:添加自定义控件并利用 GPS 硬件
学习如何在应用中添加自定义控件并利用 GPS 硬件。
- Windows Mobile 应用开发第五部分:SQL Server CE 入门
学习在移动应用中通过
DataSet
和SQLCeResultSet
访问数据。 - Windows Mobile 应用开发第六部分:设备安全和应用程序部署
了解设备安全、测试以及在 Windows Mobile 设备上安装应用程序。
- Windows Mobile 应用开发第七部分:移动 Web 开发
学习使用浏览器控件为启用了 AJAX 支持的移动设备创建基于 Web 的应用程序。
其他资源和参考
- Windows Mobile 开发者中心
- 设备模拟器参考
- 创建和运行托管代码中的简单 Windows 应用程序
- 使用 Visual Studio 为设备应用程序设计用户界面和数据
- 如何为 Windows Mobile 6 设备构建 .NET Compact Framework 3.5 应用程序?
- 如何使用 .NET Compact Framework 3.5 以编程方式确定 Windows Mobile 设备类型?
请访问 www.myrampup.com 以获取更多信息。