本演练演示如何创建文档级自定义,该自定义项使用内容控件在 Microsoft Office Word 模板中创建结构化和可重用的内容。
适用于: 本主题中的信息适用于 Word 的文档级项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能。
Word 使你能够创建可重用文档部件的集合,即命名 的构建基块。 本指南演示如何创建两个表作为构建块。 每个表都包含多个可以保存不同类型的内容的内容控件,例如纯文本或日期。 其中一个表包含有关员工的信息,另一个表包含客户反馈。
从模板创建文档后,可以使用多个 BuildingBlockGalleryContentControl 对象将其中一个表添加到文档中,这些对象在模板中显示可用的构建基块。
本演练阐释了以下任务:
- 在设计时在 Word 模板中创建包含内容控件的表。 
- 以编程方式填充组合框内容控件和下拉列表内容控件。 
- 阻止用户编辑指定的表。 
- 将表添加到模板的组成部分集合中。 
- 创建一个内容控件来展示模板中可用的构件。 - 注释 - 以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅 个性化设置 IDE。 
先决条件
你需要满足以下条件才能完成本演练:
- 包含 Microsoft Office 开发人员工具的 Visual Studio 版本。 有关详细信息,请参阅 配置计算机以开发 Office 解决方案。 
- Microsoft Word。 
创建新的 Word 模板项目
创建 Word 模板,以便用户可以轻松创建自己的副本。
创建新的 Word 模板项目
- 创建名为 MyBuildingBlockTemplate 的 Word 模板项目。 在向导中创建解决方案中的新文档。 有关详细信息,请参阅 如何:在 Visual Studio 中创建 Office 项目。 - Visual Studio 将在设计器中打开新的 Word 模板,并将 MyBuildingBlockTemplate 项目添加到 解决方案资源管理器。 
创建员工表
创建一个表,其中包含四种不同类型的内容控件,用户可以在其中输入有关员工的信息。
创建员工表
- 在 Visual Studio 设计器中托管的 Word 模板中,在功能区上,单击“ 插入 ”选项卡。 
- 在 “表 ”组中,单击“ 表”,然后插入包含两列和四行的表。 
- 在第一列中输入文本,使其与以下列相似: - 员工姓名 - 雇佣日期 - 标题 - 图片 
- 单击第二列中的第一个单元格( 员工姓名旁)。 
- 在功能区上,单击“ 开发人员 ”选项卡。 - 注释 - 如果 “开发人员 ”选项卡不可见,必须先显示它。 有关详细信息,请参阅 “如何:在功能区上显示开发人员”选项卡。 
- 在 控件 组中,单击 “文本 ”按钮  以向第一个单元格添加一个 PlainTextContentControl 。 以向第一个单元格添加一个 PlainTextContentControl 。
- 单击第二列中的第二个单元格( “雇用日期”旁)。 
- 在 “控件 ”组中,单击 “日期选取器 ”按钮  以向第二个单元格添加 a DatePickerContentControl 。 以向第二个单元格添加 a DatePickerContentControl 。
- 单击第二列中的第三个单元格(标题旁)。 
- 在“控件”组中,单击“组合框”按钮  ,以在第三个单元格中添加一个ComboBoxContentControl。 ,以在第三个单元格中添加一个ComboBoxContentControl。
- 单击第二列中的最后一个单元格( 图片旁边)。 
- 在 “控件 ”组中,单击 “图片内容控件 ”按钮  以向最后一个单元格添加一个 PictureContentControl 。 以向最后一个单元格添加一个 PictureContentControl 。
创建客户反馈表
创建一个表,其中包含三种不同类型的内容控件,用户可以在其中输入客户反馈信息。
创建客户反馈表
- 在 Word 模板中,单击前面添加的员工表后面的行,然后按 Enter 添加新段落。 
- 在功能区上,单击“ 插入 ”选项卡。 
- 在 “表 ”组中,单击“ 表”,然后插入包含两列和三行的表。 
- 在第一列中输入文本,使其与以下列相似: - 客户名称 - 满意度分级 - 注释 
- 单击第二列的第一个单元格( 客户名称旁)。 
- 在功能区上,单击“ 开发人员 ”选项卡。 
- 在 控件 组中,单击 “文本 ”按钮  以向第一个单元格添加一个 PlainTextContentControl 。 以向第一个单元格添加一个 PlainTextContentControl 。
- 单击第二列的第二个单元格( “满意度评分”旁)。 
- 在“控件”组中,单击“下拉列表(Drop-Down List)”按钮  以向第二个单元格添加DropDownListContentControl。 以向第二个单元格添加DropDownListContentControl。
- 单击第二列的最后一个单元格( 批注旁)。 
- 在“控件”组中,单击“富文本”按钮  ,以将RichTextContentControl添加到最后一个单元格中。 ,以将RichTextContentControl添加到最后一个单元格中。
以编程方式填充组合框和下拉列表
可以使用 Visual Studio 中的 “属性” 窗口在设计时初始化内容控件。 还可以在运行时初始化它们,这使你可以动态设置其初始状态。 在本次演练中,使用代码在运行时为ComboBoxContentControl和DropDownListContentControl填充条目,从而查看这些对象的工作原理。
以编程的方式修改内容控件的用户界面
- 在 解决方案资源管理器中,右键单击 ThisDocument.cs 或 ThisDocument.vb,然后单击“ 查看代码”。 
- 将以下代码添加到 - ThisDocument类。 此代码声明了稍后在本演练中使用的多个对象。
- 将以下代码添加到 - ThisDocument类的- ThisDocument_Startup方法中。 此代码将在 ComboBoxContentControl 和 DropDownListContentControl 表中添加条目,并设置这些控件在用户编辑之前显示的占位符文本。- comboBoxContentControl1.PlaceholderText = "Choose a title, or enter your own"; comboBoxContentControl1.DropDownListEntries.Add("Engineer", "Engineer", 0); comboBoxContentControl1.DropDownListEntries.Add("Designer", "Designer", 1); comboBoxContentControl1.DropDownListEntries.Add("Manager", "Manager", 2); dropDownListContentControl1.PlaceholderText = "Choose a rating (1 lowest, 3 highest)"; dropDownListContentControl1.DropDownListEntries.Add("1", "1", 0); dropDownListContentControl1.DropDownListEntries.Add("2", "2", 1); dropDownListContentControl1.DropDownListEntries.Add("3", "3", 2);
阻止用户编辑员工表
GroupContentControl使用前面声明的对象来保护员工表。 保护表后,用户仍可编辑表中的内容控件。 但是,它们不能编辑第一列中的文本,也不能以其他方式修改表,例如添加或删除行和列。 有关如何使用 a GroupContentControl 保护文档部分的详细信息,请参阅 内容控件。
防止用户编辑员工表
- 在上一步添加代码后,将以下代码添加到 - ThisDocument_Startup类的- ThisDocument方法中。 此代码通过将表放在前面声明的对象中 GroupContentControl 来防止用户编辑员工表。
将表添加到构件集合
将表添加到模板中的文档构建基块集合中,以便用户可以将已创建的表插入文档中。 有关文档构建基块的详细信息,请参阅 内容控件。
将表添加到模板中的构建基块
- 在上一步中添加的代码之后,将以下代码添加到 - ThisDocument类的方法- ThisDocument_Startup中。 此代码将包含表的新构建基块添加到 Microsoft.Office.Interop.Word.BuildingBlockEntries 集合,该集合包含模板中的所有可重用构建基块。 新的构建基块在名为 Employee 和 Customer Information 的新类别中定义,并分配构建基块类型- Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCustom1。- Word.Template template1 = this.AttachedTemplate as Word.Template; if (template1 != null) { object description = null; template1.BuildingBlockEntries.Add("Employee Table", Word.WdBuildingBlockTypes.wdTypeCustom1, "Employee and Customer Information", this.Tables[1].Range, ref description, Word.WdDocPartInsertOptions.wdInsertContent); template1.BuildingBlockEntries.Add("Customer Table", Word.WdBuildingBlockTypes.wdTypeCustom1, "Employee and Customer Information", this.Tables[2].Range, ref description, Word.WdDocPartInsertOptions.wdInsertContent); }
- 请在您上一步添加的代码后,将以下代码添加到 - ThisDocument_Startup类的- ThisDocument方法。 此代码从模板中删除表。 因为已将这些表添加到模板中的可重用模块库中,所以不再需要它们。 代码首先将文档置于设计模式,以便可以删除受保护的员工表。
创建显示构建基块的内容控件
创建一个内容控件,用于提供对之前创建的构建基块(即表)的访问权限。 用户可以单击此控件将表添加到文档中。
创建一个显示构件的内容控件
- 在上一步中添加的代码之后,将以下代码添加到 - ThisDocument类的- ThisDocument_Startup方法中。 此代码初始化 BuildingBlockGalleryContentControl 前面声明的对象。 显示BuildingBlockGalleryContentControl中定义的所有构建基块,属于“员工和客户信息”类别,并且具有构建基块类型- Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCustom1。- buildingBlockControl1 = this.Controls.AddBuildingBlockGalleryContentControl( this.Paragraphs[1].Range, "buildingBlockControl1"); buildingBlockControl1.BuildingBlockCategory = "Employee and Customer Information"; buildingBlockControl1.BuildingBlockType = Word.WdBuildingBlockTypes.wdTypeCustom1; buildingBlockControl1.PlaceholderText = "Choose your first building block"; buildingBlockControl2 = this.Controls.AddBuildingBlockGalleryContentControl( this.Paragraphs[2].Range, "buildingBlockControl2"); buildingBlockControl2.BuildingBlockCategory = "Employee and Customer Information"; buildingBlockControl2.BuildingBlockType = Word.WdBuildingBlockTypes.wdTypeCustom1; buildingBlockControl2.PlaceholderText = "Choose your second building block";
测试项目
用户可以单击文档中的构建基块库控件以插入员工表或客户反馈表。 用户可以在两个表中的内容控件中键入或选择响应。 用户可以修改客户反馈表的其他部分,但不应修改员工表的其他部分。
测试员工表
- 按 F5 运行项目。 
- 单击“ 选择第一个构建基块 ”以显示第一个构建基块库内容控件。 
- 单击控件中 自定义库 1 标题旁边的下拉箭头,然后选择 “员工表”。 
- 在 “员工姓名” 单元格右侧的单元格中单击,然后键入名称。 - 验证是否只能向此单元格添加文本。 允许用户 PlainTextContentControl 仅添加文本,而不能添加其他类型的内容,如艺术或表格。 
- 单击 “雇用日期” 单元格右侧的单元格,然后在日期选取器中选择日期。 
- 单击标题单元格右侧的单元格,然后在组合框中选择其中一个职位。 - (可选)键入不在列表中的职务的名称。 这是可能的, ComboBoxContentControl 因为允许用户从条目列表中选择或键入自己的条目。 
- 单击 图片 单元格右侧的单元格中的图标,并浏览到图像以显示它。 
- 尝试向表添加行或列,并尝试从表中删除行和列。 验证是否无法修改表。 这 GroupContentControl 可以防止你进行任何修改。 
测试客户反馈表
- 单击“ 选择第二个构建基块 ”以显示第二个构建基块库内容控件。 
- 单击控件中 自定义库 1 标题旁边的下拉箭头,然后选择 “客户表”。 
- 单击 客户名称 单元格右侧的单元格,然后键入名称。 
- 单击 “满意度评分 ”单元格右侧的单元格,然后选择其中一个可用选项。 - 验证您无法输入自定义条目。 这个DropDownListContentControl允许用户仅从条目列表中选择。 
- 在 “批注 ”单元格右侧的单元格中单击,然后键入一些批注。 - (可选)添加文本以外的某些内容,如艺术或嵌入表格。 因为用户能够添加文本以外的内容,RichTextContentControl 使这成为可能。 
- 验证是否可以向表添加行或列,以及是否可以从表中删除行和列。 这之所以可能,是因为你没有通过将表格放入GroupContentControl来进行保护。 
- 关闭模板。 
后续步骤
可以详细了解如何使用本主题中的内容控件:
- 将内容控件绑定到嵌入文档中的 XML 部件(也称为自定义 XML 部件)。 有关详细信息,请参阅 演练:将内容控件绑定到自定义 XML 部件。