代码改变世界

Windows Mobile设备常见任务开发(2)-个人信息管理

2010-12-25 14:24  MagicKing110  阅读(1179)  评论(0编辑  收藏  举报

摘要:移动开发者社区开发杂志《Windows Phone应用开发专题 第一季》中我参与编写的部分,《Windows Mobile设备常见任务开发》。主要介绍了Windows Mobile中最常见的几个开发任务,如拨打电话、发送短信、联系人管理等等。点此转到索引页

 

个人信息管理

在Windows Mobile中,联系人、约会(日历)、任务这些信息通称为个人信息。这些个人信息,通过POOM进行统一管理。在本节中,我们一起来了解一下与个人信息管理相关的基本操作。

了解POOM

POOM,即Pocket Outlook Object Model(掌上OutLook对象模型),是Microsoft.WindowsMobile.PocketOutlook命名空间中的两个核心API之一(另一个是Windows  CE Mail API,用于邮件管理),也是桌面OutLook对象模型的一个子集。

POOM定义了个人信息的基本模型。在POOM中,设备上的联系人、约会、任务这些数据都被定义为PIM(Personal Information Managemant)项。对设备中个人信息的管理,实际上就是对这些PIM项的操作。

所有的PIM项类型,如Contact类(联系人)、Appointment类(约会)、Task类(任务)有着共同的基类PimItem,每个PimItem通过ItemId进行唯一标识。正因为Contact、Appointment、Task都继承自PimItem,因此上这三类信息的操作基本类同,也正以为如此,在本节中,我们只重点介绍联系人信息的管理,对于约会及任务,只给出一些参考信息。

所有的POOM操作,都会以OutlookSession类为核心。我们通过该类的ContactsAppointmentsTasks三个公开属性来访问设备中的联系人、约会、任务信息,对设备中联系人、约会、任务项目的增删改操作,实际上就是对这三个对象中Items集合元素的增删改操作。在下文的示例中,你会经常看到这个类的出现。需要提醒的是,OutlookSession对象与数据库连接DataConection对象一样,在使用完毕后要及时释放资源。

 

借助系统标准摘要卡管理个人信息

PIM项标准摘要卡实际上是POOM提供的一个用于管理个人信息项的默认标准对话框。我们可以通过PimItem类的ShowDialog方法来打开这个对话框,提供给用户一个快速查看、修改、删除PIM项的界面。

上文已经说过,Contact、Appointment、Task都是PimItem的子类,那么对于这三个类的对象,都可以调用这个继承自PimItem的ShowDialog方法来显示标准摘要卡。

如下一行代码显示了一个已知的Contact对象的标准摘要卡。

//currentContact为一个已知的Contact对象
currentContact.ShowDialog();	

执行后,会打开如下的一个标准摘要卡对话框,右侧截图展示了相应菜单项。

WindowsMobile1_thumb11 WindowsMobile2_thumb1

在上面的截屏中我们可以看到,系统提供的默认个人信息项标准摘要卡的菜单中已经给我提供了一些针对该类项目的常用操作。这个对话框对用户是很友好的,一般情况下,通过向用户提供这个摘要卡,已经实现基本的查看、编辑、删除操作。但是通过这种方式提供的管理功能,要求用户必须参与操作,如点击相应的删除、编辑菜单。某些情况下,我们可能希望无需用户参与而完成编辑、删除等操作,或者希望提供一个更符合当前场景的信息编辑窗口,这时,我们就需要自己来编写相应的窗体及代码了。

 

联系人基本管理

联系人对应Microsoft.WindowsMobile.PocketOutlook命名空间中的Contact类,派生自PimItem。Contact类包含描述联系人的各种属性,如姓名、电话号码、电子邮件、住址等。

对于Contact类属性的详细说明,请参考SDK中Contact属性列表。这里只列出与Contact相关的几点注意事项:

  • OutlookSession对象使用完毕后最好及时调用Dispose释放资源,或者放在Using语句块中。本文没有进行这些操作是为了代码简洁。
  • 联系人的显示名通过FileAs属性控制。默认情况下,FileAs属性的值根据FirstName/LastName自动生成,当然你也可以直接指定。
  • Conatact的Picture属性(联系人头像)是只读的,想要设置联系人图像,需要用SetPicture方法。

下面是几个示范联系人管理基本操作的代码片段。为方便表述,先贴出示例的界面截屏.

WindowsMobile_thumb1 WindowsMobile2_thumb12

列出联系人:下面的代码通过OutlookSession类的Contacts属性获取设备的联系人集合,并绑定到屏幕上的一个DataGrid控件上。

private void Form_Contact_Load(object sender, EventArgs e)
{
	OutlookSession session = new OutlookSession();
	dataGrid1.DataSource = session.Contacts.Items;
}

添加联系人:添加联系人,实际上就是先创建一个Contact对象,然后通过集合的Add方法添加到OutlookSession类的Contacts.Items集合中。

private Contact AddContact()
{
	Contact newContact = new Contact(); 
	newContact.FirstName = txbFirstName.Text.Trim();
	newContact.LastName = txbLastName.Text.Trim();
	newContact.FileAs = newContact.FirstName + newContact.LastName;
	newContact.HomeTelephoneNumber = txbPhoneNumber.Text.Trim();
	newContact.Email1Address = txbEmail.Text.Trim();
	if (File.Exists(txbHead.Text))
	{
		newContact.SetPicture(txbHead.Text);
	}

	OutlookSession session = new OutlookSession();
	session.Contacts.Items.Add(newContact);
	return newContact;
}

删除联系人:通过Delete方法删除指定ItemId的Contact对象。

private void deleteContact(ItemId delItemId)
{
	Contact delContact = new Contact(delItemId);
	delContact.Delete();
}

编辑联系人:通过Update方法更新指定ItemId的Contact对象。

private Contact editContact(ItemId editItemId)
{
	Contact editContact = new Contact(editItemId);

	//为对象赋予新的属性值
	editContact.FirstName = txbFirstName.Text.Trim();
	editContact.LastName = txbLastName.Text.Trim();
	//......
	editContact.Update();
	return editContact;
}

 

选择联系人

在Windows Mobile设备中发送短信、发送Email、发传真等场景下,通常需要选择某个联系人或是联系人的特定属性。Microsoft.WindowsMobile.Forms命名空间为我们提供了一个选择联系人的专用对话框类ChooseContactDialog

调用ChooseContactDialogShowDialog方法将打开一个选择联系人的窗口,根据程序设定,用户可以选择一个联系人、一个联系人的属性或者是二者兼选。还可以通过RequiredProperties属性设置只显示包含某些特定属性的联系人,以减小筛选范围。

如在选择Emai收件人l时,可设定只显示包含Email地址的联系人;在发送传真时,设定只显示包含传真号码的联系人。

如下代码演示了通过ChooseContactDialog选择一个Email地址显示在文本框中。同样先贴出相关截屏,下面右图既是打开的联系人选择窗口。

WindowsMobile1_thumb1 WindowsMobile2_thumb11

private void btnSelectEmail_Click(object sender, EventArgs e)
{
	ChooseContactDialog dialog = new ChooseContactDialog();
	dialog.Title = "选择一个Email地址:";
	dialog.RequiredProperties = new ContactProperty[] {ContactProperty.AllEmail};
	if (dialog.ShowDialog() == DialogResult.OK)
	{
		Contact selectedContact = dialog.SelectedContact;
		txbEmail.Text = selectedContact.Email1Address;
	}
}

实际上,ChooseContactDialog的选择功能绝非这么简单。除了上面看到的必要属性删选,还可以进一步进行很多复杂的条件筛选,这个可以通过查看SDK中ChooseContactDialog属性列表来了解更多,当然可能你需要格外关注RestrictContacts属性,因为该属性与筛选关系异常密切。另外补充一下,其实在前面了解过的联系人集合类ContactConlection(OutlookSession.Contacts.Items的类型)中,同样包含与联系人筛选相关的成员,就是Restrict方法。相关内容更深入的技术,我们将在后面的教程中继续探讨,在此暂时不再展开。

 

约会/任务管理

上文已说过,Contact类(联系人)、Appointment类(约会)、Task类(任务)都派生自基类PimItem,因此上对于约会、任务的管理,与联系人是类同的。为节约篇幅,在此不再赘述。

下面仅列出一些约会、任务管理操作中的注意事项及相关参考资料:

  • 约会与提醒的大部分管理工作,和联系人一样都可以借助PIM项标准摘要卡来快速实现而无需编写太多代码。
  • 约会与任务都可以设置提醒,欲了解提醒详情请关注Appointment类的ReminderMinutesBeforeStart属性和Task类的ReminderTime属性。
  • 约会与任务都可以以重复方式进行创建,详情可查阅RecurrencePattern、ReminderRepeat等相关属性的资料。

 

通过自定义属性扩展个人信息

PIM数据项已经包含了大量的预定义的属性,可以满足我们大部分的应用,但是某些情况下我们可能还需要对个人信息项进行扩展,以实现更强大的功能。这时我们需要关注PimItem类中Properties属性,这是一个PimPropertySet类的成员,我们可以通过它的Add方法来添加新的自定义属性。

Add方法有三种形式的重载,下面的代码演示了其中最简单的一种,即指定属性名,添加新的字符串类型的自定义属性。当然,用另外的重载你还可以同时指定属性的数据类型,但是类型比较有限,仅限于Bool/Byte[]/DateTime/Double/Int16/Int32/UInt16/UInt32/String九种。

下面的示例代码中,AddProperty方法为传入的PimItem对象item添加一个名为propertyName、值为propertyValue的自定义属性。

private void AddProperty(PimItem item,string propertyName,string propertyValue)
{
	item.Properties.Add(propertyName);
	item.Properties[propertyName] = propertyValue;
	item.Update(); 
}

下面的GetPropertyValue方法,查询PimItem对象item的名为propertyName的属性,返回属性值。

private string GetPropertyValue(PimItem item, string propertyName)
{
	if (item.Properties.Contains(propertyName))
	{
		return item.Properties[propertyName].ToString();
	}
	else
	{
		return "无此属性";
	}
}

最后需要提醒的是,自定义属性无法被Outlook同步,也无法在Outlook Mobile标准对话框中显示,同时其数据类型也比较有限。因此在使用自定义属性前,要提前考虑到这些缺陷。

 

示例代码下载:PIM.zip

小结:Microsoft.WindowsMobile.PocketOutlook是Windows Mobile托管类库中应用最广泛而且最复杂的类库之一,本节我们主要了解了其中的POOM这个API通过这个API,我们可以实现对联系人、约会、任务等个人信息的管理。通过本节的学习,我们基本上可以轻松应付一般的个人信息管理类任务。然而对整个POOM而言,本节的学习,只是管中窥豹,知其一斑而已,想要熟练掌握其中的技巧并灵活运用,还需要我们继续在实践中探索。在后续教程中,我们也会对其有更深层次的研究,敬请关注!