演练:导入在 Outlook 中设计的窗体区域
此演练演示如何在 Microsoft Office Outlook 中设计窗体区域,然后使用**“新建窗体区域”**向导将该窗体区域导入到 Outlook 外接程序项目中。 通过在 Outlook 中设计窗体区域,您可以将本机 Outlook 控件添加到绑定到 Outlook 数据的窗体区域中。 导入窗体区域后,就可以处理每个控件的事件。
**适用于:**本主题中的信息适用于 Outlook 2007 和 Outlook 2010 的应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
本演练阐释了以下任务:
使用 Outlook 中的窗体区域设计器设计一个窗体区域。
将窗体区域导入 Outlook 外接程序项目。
处理窗体区域上的控件的事件。
提示
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
系统必备
您需要以下组件来完成本演练:
-
Visual Studio 2010 的一个版本,其中包含 Microsoft Office 开发工具。有关更多信息,请参见[将计算机配置为开发 Office 解决方案](bb398242\(v=vs.100\).md)。
- Microsoft Office Outlook 2007 或 Outlook 2010。
提示
以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 您安装的 Visual Studio 版本以及使用的设置决定了这些元素。 有关更多信息,请参见 使用设置。
有关相关视频演示,请参见 How Do I: Create Outlook Form Regions Using Visual Studio 2008?(如何实现:使用 Visual Studio 2008 创建 Outlook 窗体区域?)。
使用 Outlook 中的窗体区域设计器设计窗体区域
此步骤将在 Outlook 中设计一个窗体区域。 然后将该窗体区域保存到一个易于查找的位置,以便可将其导入 Visual Studio。
此示例窗体区域将完全替换常规的“任务”窗体。 它提供了一种方法来跟踪在可以执行主任务之前必须完成的所有任务(系统必备任务)的进度。 该窗体区域显示了一个系统必备任务的列表,并显示列表中每项任务的完成状态。 用户可将任务添加到列表或将它们从中移除。 还可以刷新每项任务的完成状态。
使用 Outlook 中的窗体区域设计器设计窗体区域
启动 Microsoft Office Outlook。
通过执行下列任务之一打开窗体设计器:
在 Outlook 2010 中,在**“开发工具”选项卡上单击“设计窗体”**。 有关更多信息,请参见如何:在功能区上显示“开发人员”选项卡。
在 Outlook 2007 中,在**“工具”菜单上指向“窗体”,然后单击“设计窗体”**。
在**“设计窗体”框中,单击“任务”,再单击“打开”**。
通过执行下列任务之一创建窗体区域:
在 Outlook 2010 中,在**“开发工具”选项卡上的“设计”组中,单击“新建窗体区域”**。
在 Outlook 2007 中,在**“开发工具”选项卡上的“设计”组中,单击“窗体区域”,然后单击“新建窗体区域”**。
将打开一个新的窗体区域。 如果未出现**“字段选择器”,请在“工具”组中单击“字段选择器”**。
将**“主题”字段和“% 已经完成”字段从“字段选择器”**拖动到该窗体区域中。
在**“工具”组中,单击“控件工具箱”打开“工具箱”**。
将 Label 从**“工具箱”拖入窗体区域。 将该标签放置在“主题”和“% 已经完成”**字段下面。
右击该标签,然后单击**“高级属性”**。
在**“属性”窗口中,将“Caption”属性设置为“此任务依赖于下列任务”,将“Width”属性设置为“200”,然后单击“应用”**。
将 ListBox 控件从**“工具箱”**拖入窗体区域。 将该列表框放置在“此任务依赖于下列任务”标签下面。
选择刚刚添加的列表框。
在**“属性”窗口中,将“Width”设置为“300”,然后单击“应用”**。
将 Label 从**“工具箱”**拖入窗体区域。 将该标签控件放置在列表框下面。
选择刚刚添加的标签。
在**“属性”窗口中,将“Caption”属性设置为“选择要添加到依赖任务列表中的任务”,将“Width”属性设置为“200”,然后单击“应用”**。
将 ComboBox 控件从**“工具箱”**拖入窗体区域。 将该组合框放置在“选择要添加到依赖任务列表中的任务”标签下面。
选择刚刚添加的组合框。
在**“属性”窗口中,将“Width”属性设置为“300”,然后单击“应用”**。
从**“工具箱”**中将一个 CommandButton 控件拖动到该窗体区域中。 将该命令按钮放置在组合框旁边。
选择刚刚添加的命令按钮。
在**“属性”窗口中,将“Name”设置为“AddDependentTask”,将“Caption”设置为“添加依赖任务”,将“Width”设置为“100”,然后单击“应用”**。
在**“字段选择器”中,单击“新建”**。
在**“新建字段”对话框中,在“Name”字段中键入“hiddenField”,然后单击“确定”**。
将**“hiddenField”字段从“字段选择器”**拖入窗体区域。
在**“属性”窗口中,将“Visible”设置为“0 - False”,然后单击“应用”**。
通过执行下列任务之一保存窗体区域:
在 Outlook 2010 中,在**“开发工具”选项卡上的“设计”组中,单击“保存”按钮,然后单击“窗体区域另存为”**。
在 Outlook 2007 中,在**“开发工具”选项卡上的“设计”组中,单击“窗体区域”,然后单击“窗体区域另存为”**。
将该窗体区域命名为“TaskFormRegion”,然后将其保存在计算机上某个本地目录中。
Outlook 将该窗体区域另存为 Outlook 窗体存储 (.ofs) 文件。 该窗体区域将以名称 TaskFormRegion.ofs 保存。
退出 Outlook。
创建新的 Outlook 外接程序项目
此步骤中将创建一个 Outlook 外接程序项目。 在此演练稍后的部分,将把窗体区域导入该项目。
创建新的 Outlook 外接程序项目
在 Visual Studio 中,创建一个名为“TaskAddIn”的 Outlook 外接程序项目。
在**“新建项目”对话框中选择“创建解决方案的目录”**。
将项目保存到默认项目目录中。
有关更多信息,请参见如何:在 Visual Studio 中创建 Office 项目。
导入窗体区域
使用**“新建 Outlook 窗体区域”**向导可将在 Outlook 中设计的窗体区域导入 Outlook 外接程序项目。
将窗体区域导入 Outlook 外接程序项目
在**“解决方案资源管理器”中,右击“TaskAddIn”项目,指向“添加”,再单击“新建项”**。
在**“模板”窗格中,选择“Outlook 窗体区域”,将文件命名为“TaskFormRegion”,然后单击“添加”**。
**“新建 Outlook 窗体区域”**向导启动。
在**“选择窗体区域的创建方式”页上,单击“导入 Outlook 窗体存储(.ofs)文件”,然后单击“浏览”**。
在**“现有 Outlook 窗体区域文件的位置”对话框中,浏览到“TaskFormRegion.ofs”所在的位置,选择“TaskFormRegion.ofs”,单击“打开”,然后单击“下一步”**。
在**“选择要创建的窗体区域的类型”页上,单击“全部替换”,然后单击“下一步”**。
“全部替换”窗体区域将替换整个 Outlook 窗体。 有关窗体区域类型的更多信息,请参见创建 Outlook 窗体区域。
在**“提供说明性文本并选择显示首选项”页上,单击“下一步”**。
在**“标识将显示此窗体区域的邮件类”页上的“哪些自定义邮件类将显示此窗体区域”字段中,键入“IPM.Task.TaskFormRegion”,然后单击“完成”**。
TaskFormRegion.cs 或 TaskFormRegion.vb 文件添加到项目中。
处理窗体区域上的控件的事件
现在项目中已经有了窗体区域,可以添加代码来处理添加到 Outlook 窗体区域中的按钮的 Microsoft.Office.Interop.Outlook.OlkCommandButton.Click 事件。
此外,还可以对 FormRegionShowing 事件添加在窗体区域出现时更新窗体区域中的控件的代码。
处理窗体区域上的控件的事件
在**“解决方案资源管理器”中,右击 TaskFormRegion.cs 或 TaskFormRegion.vb,然后单击“查看代码”**。
TaskFormRegion.cs 或 TaskFormRegion.vb 在代码编辑器中打开。
向 TaskFormRegion 类中添加下面的代码。 这段代码将 Outlook“任务”文件夹中每项任务的主题行填入窗体区域上的组合框中。
Private Sub populateComboBox() Dim Application As New Outlook.Application() Dim outlookNameSpace As Outlook.NameSpace = _ Application.GetNamespace("MAPI") Dim taskFolder As Outlook.MAPIFolder = _ outlookNameSpace.GetDefaultFolder _ (Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks) Dim taskItems As Outlook.Items = taskFolder.Items Dim task As Outlook.TaskItem For Each task In taskItems If Not (task.Subject Is Nothing) Then comboBox1.AddItem(task.Subject, System.Type.Missing) End If Next task comboBox1.Text = comboBox1.GetItem(0) End Sub
private void populateComboBox() { Outlook.Application Application = new Outlook.Application(); Outlook.NameSpace outlookNameSpace = Application.GetNamespace("MAPI"); Outlook.MAPIFolder taskFolder = outlookNameSpace.GetDefaultFolder( Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks); Outlook.Items taskItems = taskFolder.Items; foreach (Outlook.TaskItem task in taskItems) { if (task.Subject != null) { comboBox1.AddItem(task.Subject, System.Type.Missing); } } comboBox1.Text = comboBox1.GetItem(0); }
向 TaskFormRegion 类中添加下面的代码。 这段代码执行下列任务:
通过调用 FindTaskBySubjectName 帮助器方法并传入所要任务的主题来找到“任务”文件夹中的 Microsoft.Office.Interop.Outlook.TaskItem。 下一步将添加 FindTaskBySubjectName 帮助器方法。
将 Microsoft.Office.Interop.Outlook.TaskItem.Subject 和 Microsoft.Office.Interop.Outlook.TaskItem.PercentComplete 值添加到依赖任务列表框中。
将任务的主题添加到窗体区域上的隐藏字段中。 隐藏字段将这些值作为 Outlook 项的一部分存储。
Private Sub AddDependentTask_Click1() Handles addDependentTask.Click Dim tempTaskItem As Outlook.TaskItem = FindTaskBySubjectName _ (comboBox1.Text) If Not (tempTaskItem Is Nothing) Then Me.listBox1.AddItem(tempTaskItem.PercentComplete.ToString() & _ "% Complete -- " & tempTaskItem.Subject, System.Type.Missing) Me.olkTextBox3.Text = Me.olkTextBox3.Text & "|" & tempTaskItem.Subject End If End Sub
void AddDependentTask_Click() { Outlook.TaskItem tempTaskItem = FindTaskBySubjectName(comboBox1.Text); if (tempTaskItem != null) { this.listBox1.AddItem(tempTaskItem.PercentComplete.ToString() + "% Complete -- " + tempTaskItem.Subject, System.Type.Missing); this.olkTextBox3.Text = this.olkTextBox3.Text + "|" + tempTaskItem.Subject; } }
向 TaskFormRegion 类中添加下面的代码。 这段代码提供了在上一步中所述的帮助器方法 FindTaskBySubjectName。
Private Function FindTaskBySubjectName(ByVal subjectName As String) _ As Outlook.TaskItem Dim Application As New Outlook.Application() Dim outlookNameSpace As Outlook.NameSpace = _ Application.GetNamespace("MAPI") Dim tasksFolder As Outlook.MAPIFolder = _ outlookNameSpace.GetDefaultFolder _ (Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderTasks) Dim taskItems As Outlook.Items = tasksFolder.Items Dim taskItem As Outlook.TaskItem For Each taskItem In taskItems If taskItem.Subject = subjectName Then Return taskItem End If Next taskItem Return Nothing End Function
private Outlook.TaskItem FindTaskBySubjectName(string subjectName) { Outlook.Application Application = new Outlook.Application(); Outlook.NameSpace outlookNameSpace = Application.GetNamespace("MAPI"); Outlook.MAPIFolder tasksFolder = outlookNameSpace.GetDefaultFolder( Microsoft.Office.Interop.Outlook. OlDefaultFolders.olFolderTasks); Outlook.Items taskItems = tasksFolder.Items; foreach (Outlook.TaskItem taskItem in taskItems) { if (taskItem.Subject == subjectName) { return taskItem; } } return null; }
向 TaskFormRegion 类中添加下面的代码。 这段代码执行下列任务:
刷新窗体区域中的列表框获得每项依赖任务的当前完成状态。
分析隐藏文本字段以获取每项依赖任务的主题。 然后这段代码通过调用 FindTaskBySubjectName 帮助器方法并传入每项任务的主题来找到“任务”文件夹中的每项 Microsoft.Office.Interop.Outlook.TaskItem。
将 Microsoft.Office.Interop.Outlook.TaskItem.Subject 和 Microsoft.Office.Interop.Outlook.TaskItem.PercentComplete 值添加到依赖任务列表框中。
Private Sub RefreshTaskListBox() listBox1.Clear() Dim tempTaskItem As Outlook.TaskItem Dim tempArray As [String]() = olkTextBox3.Text.Split(New [Char]() {"|"c}) Dim tempString As String For Each tempString In tempArray tempTaskItem = FindTaskBySubjectName(tempString) If Not (tempTaskItem Is Nothing) Then Me.listBox1.AddItem(tempTaskItem.PercentComplete.ToString() & _ "% Complete -- " & tempTaskItem.Subject, System.Type.Missing) End If Next tempString End Sub
void RefreshTaskListBox() { listBox1.Clear(); Outlook.TaskItem tempTaskItem; String[] tempArray = olkTextBox3.Text.Split(new Char[] { '|' }); foreach (string tempString in tempArray) { tempTaskItem = FindTaskBySubjectName(tempString); if (tempTaskItem != null) { this.listBox1.AddItem(tempTaskItem.PercentComplete.ToString() + "% Complete -- " + tempTaskItem.Subject, System.Type.Missing); } } }
用下面的代码替换 TaskFormRegion_FormRegionShowing 事件处理程序。 这段代码执行下列任务:
当窗体区域出现时,将任务主题填入窗体区域中的组合框。
在窗体区域出现时调用 RefreshTaskListBox 帮助器方法。 这将显示先前在打开项时添加到列表框中的任何依赖任务。
Private Sub TaskFormRegion_FormRegionShowing(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.FormRegionShowing populateComboBox() RefreshTaskListBox() End Sub
private void TaskFormRegion_FormRegionShowing (object sender, EventArgs e) { populateComboBox(); RefreshTaskListBox(); this.addDependentTask.Click += new Microsoft.Office.Interop.Outlook. OlkCommandButtonEvents_ClickEventHandler(AddDependentTask_Click); }
测试 Outlook 窗体区域
若要测试窗体区域,请将任务添加到窗体区域中的系统必备任务列表中。 更新系统必备任务的完成状态,然后查看系统必备任务列表中的任务更新后的完成状态。
测试窗体区域
按 F5 运行项目。
Outlook 即会启动。
在 Outlook 中,通过执行下列任务之一创建任务:
在 Outlook 2010 中,在**“主页”选项卡上,单击“新建项目”,然后单击“任务”**。
在 Outlook 2007 中,在**“文件”菜单上,指向“新建”,然后单击“任务”**。
在任务窗体上的**“主题”**字段中,键入“依赖任务”。
在功能区**“任务”选项卡上的“操作”组中单击“保存并关闭”**。
在 Outlook 中,通过执行下列任务之一创建窗体区域实例:
在 Outlook 2010 中的**“主页”选项卡上,依次单击“新建项”、“更多项”[More Items]和“选择窗体”**。
在 Outlook 2007 中的**“文件”菜单上,指向“新建”,然后单击“选择窗体”**。
在**“选择窗体”对话框中,单击“TaskFormRegion”,然后单击“打开”**。
此时会出现**“TaskFormRegion”**窗体区域。 此窗体将替换整个任务窗体。 **“选择要添加到依赖任务列表中的任务”**组合框中填入了“任务”文件夹中的其他任务。
在任务窗体上的**“主题”**字段中,键入“主任务”。
在**“选择要添加到依赖任务列表中的任务”组合框中,选择“依赖任务”,然后单击“添加依赖任务”**。
此时**“0% 已经完成 -- 依赖任务”出现在“此任务依赖于下列任务”**列表框中。 这表明已成功处理该按钮的 Microsoft.Office.Interop.Outlook.OlkCommandButton.Click 事件。
保存并关闭**“主任务”**项。
在 Outlook 中重新打开“依赖任务”项。
在“依赖任务”窗体中,将**“% 已经完成”**字段更改为 50%。
在“依赖任务”功能区的**“任务”选项卡上的“操作”组中单击“保存并关闭”**。
在 Outlook 中重新打开**“主任务”**项。
此时**“已完成 50% -- 依赖任务”出现在“此任务依赖于下列任务”**列表框中。
后续步骤
有关如何自定义 Outlook 应用程序用户界面的更多信息,请参见以下主题:
若要更多了解如何通过将托管控件拖入可视化设计器来设计窗体区域的外观,请参见演练:设计 Outlook 窗体区域。
若要了解如何自定义 Outlook 项的功能区,请参见自定义 Outlook 功能区。
若要更多了解如何将自定义任务窗格添加到 Outlook,请参见自定义任务窗格概述。