.Net Compact Framework 基础篇(4)

Author:冯峰

这篇文章主要讲述: Microsoft.WindowsMobile.PocketOutlook命名空间下的五个类:

  1. OutlookSession
  2. AppointmentCollection, Appointment
  3. ContactCollection, Contact
  4. SmsMessage
  5. EmailMessage

该命名空间主要针对 PocketOutlook中的所提供的 Appointment(约会), Task(计划), Contact(联系人), 短信 , 邮件的操作。
注:在 WM5.0系统中已提供该命名空间,即 CF2.0下也提供支持。

下面就开始逐个介绍。首先运行下程序效果。

OutlookSession是取得 PocketOutlook中的所有信息的一个对象 , 该对象提供访问 PocketOutlook对象模型的一个入口。通过该对象 , 可以操作 PocketOutlook所提供的所有操作。

当点击 Appointments时 , 取得已存在的 Appoint, 并添加一个新的 Appoint.
通过 OutlookSession.Appointments.Item得到 AppointmentCollection(所有集合 ). 该集合内存放所有 Appointment.
这些 Appointment按照时间的顺序排列 . 当然 , 你也可以指定按什么排序 . 使用 Sort方法 , 并指定排序字段即可 .
AppointmentCollection的 AddNew方法:在集合对象中创建一个新 Appointment, 并将该对象返回 , 类似于 DataRow.
返回新对象后 , 对该对象的属性进行赋值后 , 通过该对象的 Update方法 , 就能自动更新集合内信息 .

代码如下:

1             OutlookSession session = new OutlookSession();
 2 
 3             foreach (Appointment app in session.Appointments.Items)
 4              {
 5                 this.listBox1.Items.Add("ItemId: " + app.ItemId);
 6                 this.listBox1.Items.Add("Subject: " + app.Subject);
 7                 this.listBox1.Items.Add("AllDayEvent: " + app.AllDayEvent.ToString());
 8                 this.listBox1.Items.Add("Body: " + app.Body);
 9                 this.listBox1.Items.Add("BusyStatus: " + app.BusyStatus.ToString());
10                 this.listBox1.Items.Add("Location: " + app.Location);
11                 this.listBox1.Items.Add("");
12             }
13 
14             Appointment appAdd = session.Appointments.Items.AddNew();
15             appAdd.Subject = "Add Now";
16             appAdd.Location = "Shanghai";
17             appAdd.Start = System.DateTime.Now.AddHours(1);
18             appAdd.End = System.DateTime.Now.AddHours(2);
19             appAdd.BusyStatus = BusyStatus.Busy;
20             appAdd.Update();

效果如下:

Appoint没有添加时的效果 .

Appointment与 AppointmentCollection也有很多事件 , 这里举一个 AppointmentCollection的 ListChanged事件 .
当 AppointmentCollection集合中的任一 Appoint发生变化 (新增 , 修改 , 删除 )时 , 该事件即会被触发 .
代码如下:

1         void Items_ListChanged(object sender, ListChangedEventArgs e)
 2          {
 3             //this.listBox1.Items.Add("Type Name: " + sender.GetType().FullName);
 4             AppointmentCollection appCol = (AppointmentCollection)sender;
 5             if (e.ListChangedType == ListChangedType.ItemChanged)
 6              {
 7                 this.listBox1.Items.Add("ItemId: " + appCol[e.NewIndex].ItemId);
 8                 this.listBox1.Items.Add("Subject: " + appCol[e.NewIndex].Subject);
 9                 this.listBox1.Items.Add("AllDayEvent: " + appCol[e.NewIndex].AllDayEvent.ToString());
10                 this.listBox1.Items.Add("Body: " + appCol[e.NewIndex].Body);
11                 this.listBox1.Items.Add("BusyStatus: " + appCol[e.NewIndex].BusyStatus.ToString());
12                 this.listBox1.Items.Add("Location: " + appCol[e.NewIndex].Location);
13                 this.listBox1.Items.Add("");
14             }
15         }

效果如下:

Subject为 Add Now为添加的 Appoint.

Contact对象 , 通过 OutlookSession的 Contacts.Items得到 Con tactCollection.
访问方法与 Appoint一致 .在此 , 只演示代码 .

1         private void menuItem7_Click(object sender, EventArgs e)
 2          {
 3             OutlookSession session = new OutlookSession();
 4 
 5             foreach (Contact contact in session.Contacts.Items)
 6              {
 7                 this.listBox1.Items.Add("File As: " + contact.FileAs);
 8                 this.listBox1.Items.Add("Email1Address: " + contact.Email1Address);
 9                 this.listBox1.Items.Add("");
10             }
11 
12             Contact contactAdd = session.Contacts.Items.AddNew();
13             contactAdd.FileAs = "Test Man";
14             contactAdd.FirstName = "Test";
15             contactAdd.LastName = "Man";
16             contactAdd.Email1Address = "Test@abs.com";
17             contactAdd.Update();
18         }

效果如下:

Task, TaskCollection:看过上述的 Appoint与 Contact后 , 相信大家也一定能够使用 Task的 . 使用方式完全一致 .
Appoint, Contact, Task. 在 OutlookSession中唯一标识符为 ItemId. 可以在集合中通过 ItemI d来取得你需要的某一个内容 .
并且它们可以创建除 ItemId以外 , 内容完全一致的对象 , 这是完全存在的 .

SmsMessage:短信对象 .可以在构造函数时传入要发送的号码及内容 , 也可以在创建完对象后对其属性进行修改 .
该对象提供 Send方法 , 用于发送短信 . 当然 , 也可以通过 OutlookSession的 SmsAccount.Send方法发送 , 这都是一样的 .
注:短信不支持彩信功能 , 只能发送文字信息 . 当程序自己发送消息完后 , 发送的消息并不会出现在短信的已发送栏里 .这和邮件发送不一致的地方 , 需了解 . 另外 , 微软的 IDE(VS 2008)中存在一个 BUG, 就是访问 SmsMessage对象的 Body时 , 显示提示居然说是只读的 , 但其实是读写都可以的 .

应该改为 Gets Or Sets the SMS message's text body.
代码如下:

1         private void menuItem4_Click(object sender, EventArgs e)
 2          {
 3             SmsMessage smsMessage = new SmsMessage(strContract, strMessage);
 4             smsMessage.RequestDeliveryReport = false;
 5             //smsMessage.Send();
 6 
 7             OutlookSession session = new OutlookSession();
 8             this.listBox1.Items.Add("SmsAccount Name: " + session.SmsAccount.Name);
 9             //this.listBox1.Items.Add("ItemID: " + smsMessage.ItemId.ToString());
10             session.SmsAccount.Send(smsMessage);
11 
12             SmsMessage sms = new SmsMessage();
13             sms.Body = "Test";
14             sms.To.Add(new Recipient(strContract));
15             session.SmsAccount.Send(sms);
16         }

通过 Call Emulator工具 ,取得短信 .

EmailMessage:发送邮件对象 .
如果没有设置好 EmailAccounts, 是无法正常发送 Email的 .
代码如下:

1         private void menuItem5_Click(object sender, EventArgs e)
 2          {
 3             EmailMessage mail = new EmailMessage();
 4             mail.To.Add(new Recipient("appleseeker@gmail.com"));
 5             mail.Importance = Importance.High;
 6             mail.Subject = "It is test mail";
 7             mail.BodyText = "It is test mail";
 8             mail.Attachments.Add(new Attachment(@"\flower.jpg"));
 9 
10             OutlookSession session = new OutlookSession();
11             if (session.EmailAccounts.Count > 0)
12                 mail.Send(session.EmailAccounts[1]);
13         }

OutlookSession.EmailAccount中 , 我访问集合中第 2个元素的理由:
因为当前是模拟器开发 ,所有该 EmailAccounts中第 1个元素是模拟器 .只有后面的才是在模拟器上说设置的 Mail帐户 .
效果如下:

没有发送邮件时 .

EmailMessage对象调用 Send后 ,邮箱的邮件情况 .

本文就 PocketOutlook中的一些基本操作内容讲述完毕 ,改天会对如何操作 PocketOutlook.MessageInterception命名空间作一下讲述 ,该空间提供消息拦截 ,起到过滤效果 .

代码下载:SmartDeviceOutlookDemo_2008_03_24.rar

 

下一篇:(冯峰).Net Compact Framework 基础篇(5)