自定义SharePoint 2010 功能区

自定义和扩展 SharePoint 2010 Server 功能区 此主题尚未评级 - 评价此主题 发布日期: 2011 年 1 月

了解构成 SharePoint 2010 服务器功能区的组件以及如何通过演练两个功能区自定义项方案来自定义功能区。

适用范围: Microsoft SharePoint Foundation 2010 | Microsoft SharePoint Server 2010 | Microsoft Visual Studio 2010 中的 SharePoint 开发工具

供稿人:Andrew Connell,Critical Path Training, LLC(该链接可能指向英文页面)

目录

SharePoint 2010 Server 功能区简介

SharePoint 2010 Server 功能区体系结构

自定义 SharePoint 2010 Server 功能区

自定义内置 SharePoint 2010 Server 功能区组件

创建自定义 SharePoint 2010 Server 功能区组件

自定义 SharePoint 2010 Server 功能区开发提示和技巧

结论

其他资源

下载本文附带的代码:MSDN 示例 - 自定义和扩展 SharePoint 2010 Server 功能区(该链接可能指向英文页面)

SharePoint 2010 Server 功能区简介 随着 2007 Microsoft Office system 的发布,Microsoft 引入了一个称作“功能区”的新用户界面结构,它代替了以前的应用程序下拉菜单和工具栏。大量的调查研究表明,某些应用程序(例如,Microsoft Word)包含太多命令,导致用户难以找到所需的命令,功能区正是为解决这个问题而引入的。

功能区的前提是提供一个更加以结果为导向的界面。用户可将精力集中在他们执行的操作上,系统将仅显示用户可在特定时间执行的操作的命令。例如,当用户明确地键入文本并且未选择图像或表时,没有理由为用户提供与文档中的表或图像交互的命令。但是,通过使用“插入”选项卡,用户可轻松添加表或图片。仅在用户选择了表或图片时,才会出现新的命令结构。当表或图片不再是焦点时,这些命令将消失。

在 2007 Microsoft Office system 中,已在 Microsoft Word、Microsoft Excel 和 Microsoft PowerPoint 中实现功能区。Microsoft 在此基础上进行了扩展,并已将功能区添加到所有 Microsoft Office 2010 应用程序(包括 Microsoft OneNote 2010、Microsoft Access 2010 和 Microsoft InfoPath 2010)。

类似于 Microsoft Office 客户端,SharePoint 用户在查找控件以完成其工作上遇到了类似的难题。命令在页面中的多个位置存在,从“网站操作”菜单到管理 Web 部件或到列表中的“编辑控件块”(ECB) 菜单。图 1 演示了对 Windows SharePoint Services 3.0 网站中的用户可用的所有菜单。

 

图 1. Windows SharePoint Services 3.0 中的菜单和命令

 

在 Microsoft SharePoint 2010 中,Microsoft 已将服务器功能区添加到 SharePoint,以解决用户在使用 Microsoft Office 客户端中的许多命令时遇到的难题。已将所有命令和菜单项从 SharePoint 中的主工作区向上推入始终固定到浏览器窗口顶部的功能区。2007 Microsoft Office system 的用户或已实现功能区的其他应用程序的用户会发现,由于 SharePoint 功能区与 Office 客户端功能区非常相似,因此调节 SharePoint 功能区非常轻松。该功能区在外观、工作方式和执行的操作上与 Office 功能区类似,并且具有与 Office 功能区相同的控件。Office 功能区和 SharePoint 服务器功能区之间的唯一差异与技术有关;例如,与在桌面(胖客户端)体验中一样,难以在 Web(瘦客户端)体验中显示不同的字体。

SharePoint 2010 中的功能区是基于与 Office 客户端功能区类似的体系结构构建的。Microsoft 使用此体系结构在 SharePoint 2010 中实现默认功能区。此体系结构还允许第三方开发人员自定义和扩展 SharePoint 中包含的现有功能区组件以及创建命令结构。

本文介绍了 SharePoint 服务器功能区的组件,以便您了解功能区的构造方式。然后,说明并演示了开发人员自定义和扩展功能区的方式。SharePoint Foundation 2010 通用参考中有一节专门介绍了功能区,并包含各种自定义演练。在自定义功能区时,建议您将本文与 SharePoint Foundation 2010 通用参考(具体而言是 SharePoint Foundation 中的服务器功能区一节)配合使用。

SharePoint 2010 Server 功能区体系结构 默认功能区由 SharePoint 构建且基于作为主安装的一部分的单个文件。此文件是在路径 {SharePoint Root}\TEMPLATE\GLOBAL\XML\CMDUI.XML 中找到的全局网站定义的一部分。此文件包含 SharePoint Foundation 2010 中的功能区组件(例如,“浏览”、“页”、“列表”、“库”和“文档”选项卡)的定义。

虽然 CMDUI.xml 文件包含所有核心服务器功能区组件,这与对功能区实现其他自定义的方式无关。SharePoint 功能用于实现对功能区的其他更改。例如,Microsoft SharePoint Server 2010 包括许多需要功能区修改的任务,例如,与“企业内容管理”、“表单服务”和商业智能相关的任务。所有这些更改都是通过使用 SharePoint 功能实现的。SharePoint 开发人员还可通过使用功能来自定义功能区,如本文后面的创建自定义 SharePoint 2010 Server 功能区组件中所述。

SharePoint 2010 扩展了功能架构(具体而言为 元素),使其成为所有功能区自定义项的工具。通过将 Location 属性设置为 CommandUI.Ribbon 并添加一个 子元素,可以做到这一点。SharePoint 2010 SDK 概述了服务器功能区 XML。

以下各节说明了功能区的两大核心部分:构成视觉体验的组件以及在单击功能区中某个控件时运行的代码。

SharePoint 2010 Server 功能区组件 SharePoint 2010 服务器功能区包含各种组件,如图 2 所示。

 

图 2. SharePoint 2010 Server 功能区组件

  图中的标注号指向以下特定组件:

1.选项卡

2.组

3.控件

4.上下文选项卡组

后面几节简要介绍了这些组件及其使用。

SharePoint 2010 Server 功能区上的选项卡 选项卡是服务器功能区的根。它们包含一个或多个组,并包含相似的功能。例如,在图 2 中,当前选定的“页”选项卡包含与使用当前页相关的功能。

SharePoint 2010 Server 功能区上的上下文选项卡组 上下文选项卡组用于提供当前上下文的非全局功能(例如页)。它们仅在遇到某些情况时出现且包含一个或多个选项卡。

例如,图 2 中的功能区演示“库工具”上下文选项卡组,该组仅在文档库中显示或(在此示例中)当选中与文档库关联的当前页面上的“列表视图 Web 部件”时显示。

上下文选项卡组会在功能和菜单选项不可用时为用户隐藏它们,并在功能和菜单选项可用时为用户显示它们。上下文选项卡组的其他示例包括在编辑 wiki 页时出现的“编辑工具”上下文选项卡组,或在编辑模式下选中某张图片时出现的“图片工具”上下文选项卡组。

SharePoint 2010 Server 功能区上的组 功能区中的每个选项卡均包含一个组或一系列组。组用于将控件与相似功能关联。每个组均与一个模板关联,该模板根据功能区缩放定义组的布局及其显示方式。功能区缩放是指功能区中有太多控件要显示的情况,例如,当浏览器未处于全屏最大化显示状态而只是处于窗口状态时。

SharePoint 2010 Server 功能区上的组模板 组模板用于为组中的控件定义不同的布局选项。Microsoft 在 CMDUI.xml 文件中包含 29 个组模板(若要查找这些模板,请在此文件的结尾搜索元素 )。

SharePoint 2010 Server 功能区上的控件 如果用户未选择或单击任何项,则功能区将是不完整的。控件是用户可与之交互的功能区内部的项。控件驻留在组中,其中包括按钮、切换按钮、复选框、文本框和许多其他控件。有关所有可用控件的完整列表,请参阅服务器功能区的体系结构。

每个控件定义包含一个 Command 属性,在单击或选中该属性时,会告知功能区基础结构要执行的操作。

SharePoint 2010 中的服务器功能区命令 服务器功能区使用命令处理用户执行的单击或选择操作。熟悉命令基础结构在 Windows Presentation Foundation 或 Microsoft Silverlight 4 中的工作方式的用户会发现它等同于服务器功能区命令基础结构。每个命令都进行了命名,并在控件中引用相应的名称。最重要的是,这些命令包含两条非常重要的详细信息:

当前命令是否可用  例如,“删除”命令仅在文档库中或选中文档时可用。

应运行的代码  例如,“删除”命令可能会使用 SharePoint 2010 客户端对象模型来删除列表中的项、显示已删除文档通知并在页面上刷新列表视图 Web 部件。

主题服务器功能区的体系结构包含与命令基础结构的工作方式相关的其他详细信息。

通过使用 ECMAScript(JavaScript、JScript) 编写服务器功能区中的命令。可通过两种方式实现命令:

通过命令 UI 处理程序

通过页面组件

以下各节中对这两个选项进行了说明,并讨论了每个选项的优缺点。通常,简单且相对较小的命令适用于命令 UI 处理程序选项。但是,较为复杂且需要实现大量 JavaScript 的命令可能更适用于页面组件。本文后面的文档库示例中使用的示例功能区自定义项演示如何使用每种技术来执行完全相同的操作。

使用命令 UI 处理程序实现服务器功能区命令 命令 UI 处理程序是通过结合使用声明性标记和 JavaScript 来实现的。在定义功能区自定义项(使用 元素进行定义)的同一 Feature 元素清单中使用 元素定义这些处理程序。此元素包含以下三个属性:

Command  将在控件中引用的命令名称。

CommandAction  触发该命令时执行的 JavaScript。

EnabledScript  JavaScript,服务器功能区命令基础结构调用它来确定该命令是否可用。此脚本应返回一个布尔值,如果该命令可用,则为 TRUE;如果该命令不可用,则为 FALSE。如果该命令不可用,则功能区基础结构会将功能区中的该命令灰显,并且在用户选择该命令时不调用它。

使用命令 UI 处理程序的优点

通常,对于大多数开发人员而言,命令 UI 处理程序更易于编写和管理。由于这些处理程序是以声明方式定义的,因此功能区框架会将脚本添加到其中的引用控件需要命令的任何页面。

使用命令 UI 处理程序的缺点

命令 UI 处理程序的缺点之一是,当它们包含大量自定义 JavaScript 时会变得难以管理、调试和进行故障排除。此外,由于这些处理程序会作为内联脚本块添加到每个页面中,因此无法通过浏览器对其进行缓存,并且每次都必须下载,从而增加了整体页权重。

使用页面组件实现服务器功能区命令 除了使用命令 UI 处理程序外,还可以使用页面组件。页面组件是一个在外部脚本库 (.js) 文件中定义的 JavaScript 对象。该对象实现了几个属性和方法,它们将告知服务器功能区命令基础结构如何初始化该对象、该对象可处理哪些命令以及某个特定命令是否可用,并可在页面组件接收焦点或失去焦点时做出响应。

必须将此脚本文件添加到显示功能区自定义项的同一页面中。可通过多种方法来实现这一点。第一种方法是,使用 SharePoint 2010 中的新 功能,根据功能的范围将库添加到网站、网站集、Web 应用程序或服务器场中的所有页面。另一种方法是,从自定义应用程序或网站页面 (.aspx)、自定义用户控件 (.ascx) 或自定义服务器控件内的托管代码添加脚本。以下代码示例将向 Web 部件内的页面添加页面组件文件。

C#复制  private void LoadAndActivateRibbonContextualTab() {   SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);   // Ensure ribbon exists.   if (ribbon != null) {     // Load dependencies if not already on the page.     ScriptLink.RegisterScriptAfterUI(this.Page, "SP.Ribbon.js", false, true);

    // Load and activate contextual tab.     ribbon.MakeTabAvailable("Ribbon.PropertyChangerTab");     ribbon.MakeContextualGroupInitiallyVisible("Ribbon.WebPartContextualTabGroup", string.Empty);   } }

使用页面组件的优点

由于所有 JavaScript 都位于外部脚本库中,因此更易于对页面组件(而非命令 UI 处理程序)进行管理、故障排除和调试(Microsoft Visual Studio 2010 脚本调试器可设置断点并附加到库)。另外,由于它是一个外部库,因此浏览器可缓存该库,而无需每次在页面上引用它时向它发出请求。

还可利用页面组件更好地控制命令,因为它们可通过接收或丢失焦点来启用或禁用页面组件,并处理上述每种情况下发生的事件。

另外,由于它们是外部库,因此,一个页面组件可处理多个控件的命令,并可在各种功能区自定义项中重用。

使用页面组件的缺点

相对于使用命令 UI 处理程序,使用页面组件的一个缺点是需要大量脚本。这主要是因为开发人员在页面上构建、注册和初始化一个脚本对象。另外,不熟悉面向对象的 JavaScript 技术的开发人员会发现要做到这一点会有点难度。

使用页面组件的另一个缺点是,必须将其添加到页面,因为这不是由功能区命令基础结构处理的。

自定义 SharePoint 2010 Server 功能区 当开发人员希望自定义 SharePoint 服务器功能区时,会为其提供两个选项。以声明方式或以编程方式应用自定义项。使用功能实现本文前面所述的声明性方法;具体而言,带 子元素的 元素。

编程方法包括将声明性构造作为字符串添加到服务器功能区对象中。本文的其余内容将重点说明声明性方法,因为也可将这些技术应用于编程方法。SharePoint 2010 SDK 包含有关以编程方式自定义功能区的演练:演练:使用上下文选项卡创建自定义 Web 部件。

自定义内置 SharePoint 2010 Server 功能区组件 开发人员可通过三种方式自定义功能区:

向功能区添加组件(选项卡、上下文选项卡组、组和控件)。

在功能区中修改现有组件。

从功能区中删除现有组件。

可以声明方式执行所有这三个选项。服务器功能区 XML 演示了不同的元素。服务器功能区的声明性自定义项演示如何向功能区添加三个常用组件。

修改和移除组件(例如,选项卡、组和控件)的方式与修改和移除相同架构元素的方式很类似。通过重复元素的 ID 并替换其内容来修改元素,这与内容占位符在 Microsoft ASP.NET 2.0 母版页中的工作方式类似。移除操作与修改操作相同,只不过容器保留为空。有关详细信息,请参阅服务器功能区的声明性自定义项。

创建自定义 SharePoint 2010 Server 功能区组件 以下两节演示如何自定义 SharePoint 2010 服务器功能区。这两个演练都使用了各种技术,并对每个组件进行了详细说明。有关这两个演练的示例代码,请参阅 MSDN 示例 - 自定义和扩展 SharePoint 2010 Server 功能区(该链接可能指向英文页面)。此示例代码只需要一个 SharePoint Foundation 2010 网站集。

第一个示例为 WebPartRibbonContextualTab(如图 3 所示),它演示如何创建使用以下功能区自定义项的自定义 Web 部件:

上下文选项卡组

自定义选项卡

自定义组

命令 UI 处理程序

仅当 Web 部件位于页面上时激活上下文选项卡组

单击功能区上的按钮时触发并处理服务器端回发。

 

图 3. 带上下文选项卡组的 Web 部件

  第二个示例为 ApplyDocumentPrefixRibbon(如图 4 所示),它演示如何实现以下自定义项和技术:

现有功能区选项卡中的自定义组。

具有不同布局选项的自定义组模板。

执行相同操作的两个自定义命令,只不过其中一个命令是通过命令 UI 处理程序实现的,而另一个命令实现自定义页面组件:

除非选中库中的一个或多个文档,否则将禁用命令。

单击时,命令将打开一个对话框,传递选定文档并根据用户输入执行操作。

在对话框的工作完成后,该对话框将关闭,同时命令将显示一条通知消息并刷新列表视图 Web 部件而非整个页面。

按条件加载页面组件的自定义服务器控件。

 

图 4. 具有页面组件的自定义组

  注释: 为了便于阅读,已略去示例代码中的某些标记。有关完整代码引用,请参阅 MSDN 示例 - 自定义和扩展 SharePoint 2010 Server 功能区(该链接可能指向英文页面)。  

如何:创建支持 Web 部件的上下文选项卡并利用回发 在本示例中,在将 Web 部件添加到页面时,将显示上下文选项卡,如之前的图 3 所示。此选项卡包含提供几个按钮的两个组。第一个组中的按钮不执行任何操作,而只演示如何使用默认模板之一。但是,“Write to Web Part via PostBack”按钮会发布一次回发。Web 部件包含用于检查按钮是否已发布回发的代码,如果出现此情况,则向 Web 部件的内容中添加一些文本。

步骤 1:创建 Web 部件 第一个步骤是创建 Web 部件。使用新的 Microsoft Visual Studio 2010 中的 SharePoint 开发工具创建一个 SharePoint 项目,并向该项目中添加一个 Web 部件 SharePoint 项目项。CreateChildControls 方法执行两个操作:将一些文本写入 Web 部件,并在引发特定回发事件时调用方法以处理情况,如以下代码中所示。

C#复制  public class RibbonizedWebPart : WebPart {   private string POSTBACK_EVENT = "RibbonizedWebPartPostback";

  protected override void CreateChildControls() {     this.Controls.Add(       new LiteralControl(         "Ribbonized Web Part contents go here"       )     );

    // Handle postback from ribbon.     HandleRibbonPostback();   } }

接下来,创建处理回发事件的方法。如果它是一个特定的回发事件,则它会将其他一些文本写入 Web 部件的内容,如以下代码所示。

C#复制  private void HandleRibbonPostback() {   if (this.Page.Request["__EVENTTARGET"] == POSTBACK_EVENT) {     this.Controls.Add(       new LiteralControl(         "

Responding to postback event from ribbon.

"       )     );   } }

最后一步是,实现将向页面中添加自定义上下文选项卡的代码。可从 Web 部件的生命周期的 OnPreRender 阶段实现这一点。它必须获得对服务器功能区的引用,并确保已在页面上加载脚本依赖项。最后,为了显示上下文选项卡,它使 ID 为 Ribbon.PropertyChangerTab 的选项卡可用,并告知功能区在加载页面时使 ID 为 Ribbon.WebPartContextualTabGroup 的上下文选项卡可用,如以下代码所示。

C#复制  protected override void OnPreRender(EventArgs e) {   LoadAndActivateRibbonContextualTab();   base.OnPreRender(e); }

private void LoadAndActivateRibbonContextualTab() {   SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);   // Ensure ribbon exists.   if (ribbon != null) {     // Load dependencies if not already on the page.     ScriptLink.RegisterScriptAfterUI(this.Page,       "SP.Ribbon.js", false, true);

    // Load and activate contextual tab.     ribbon.MakeTabAvailable("Ribbon.PropertyChangerTab");     ribbon.MakeContextualGroupInitiallyVisible(       "Ribbon.WebPartContextualTabGroup", string.Empty);   } }

步骤 2:创建服务器功能区组件自定义项 创建 Web 部件后,下一步是创建服务器功能区组件自定义项。为此,您创建一个上下文选项卡组,一个带两个组的选项卡和几个控件。

Microsoft Visual Studio 2010 中的 SharePoint 开发工具不包含用于自定义功能区的 SharePoint 项目项模板。然而,通用的 SharePoint 项目项“空元素”可用于包含功能区自定义项,因此向项目中添加一个新的空元素。

步骤 2.1:向 Element 中添加核心功能区标记 在项目的新“Element”SharePoint 项目项中,向 element.xml 文件中添加以下标记。

XML复制                          

这将告知 SharePoint 以下内容:

元素清单包含适用于任何位置的功能区 () 的功能区自定义项。有五个针对 Location 属性的选项。开发人员可以通过其他选项指定,在显示列表视图 Web 部件时或者在某个项的显示、新建或编辑表单上应显示自定义项。另外,RegistrationType 和 RegistrationId 允许开发人员对自定义项的显示位置进行更精确地定位。例如,开发人员可面向特定的内容类型。服务器功能区 XML 中列出了所有选项。

还包括功能区自定义项的基本结构。

步骤 2.2:添加新的上下文选项卡组 接下来,添加将创建上下文选项卡组的以下标记。

XML复制                                                                    

Location 属性告知功能区向其中的上下文选项卡添加以下内容,即一个或多个 元素。

元素定义新组。它具有一个与上下文组的名称匹配的 Id 属性,Web 部件的代码告知功能区在最初加载页面时使该上下文组可见。

Sequence 属性告知 SharePoint 此上下文组的顺序(当存在其他上下文组时)。为 SharePoint 上下文组给定的序列将从 100 开始(即“编辑工具”上下文组),然后按 100 递增。因此,如果存在“编辑工具”组,则上下文组可能会显示在第一个或第二个位置。有关如何查找其他上下文组的名称和序列的信息,请参见本文后面的自定义 SharePoint 2010 Server 功能区开发提示和技巧一节。

Command 属性将此组与命令名称关联。在某些情况下,当选中此选项卡组时,运行脚本可能会很有用。但在此情况下,命令(稍后实现)用于告知功能区激活上下文组的时间。如果未实现,则一旦用户单击任何项,就会促使功能区隐藏自定义组。

步骤 2.3:向上下文选项卡组添加选项卡 在创建上下文选项卡组后,添加以下标记以添加新选项卡并定义最大大小布局组模板。

XML复制                                                              

在围绕 元素的此代码段中,需要注意两点。它将稍后定义的组(通过 GroupId 属性)与模板中定义的布局选项 LargeLarge(通过 Size 属性)关联。

步骤 2.4:向选项卡添加组 现在,通过添加以下标记向新选项卡添加组。

XML复制                                                             ...                                                  

虽然本示例中有两个组,但此代码列表中仅显示第二个组。请注意,组包含 Id 属性,该属性与之前已添加的 元素匹配。

另请注意,组使用的是一个名为 Ribbon.Templates.Flexible2 的模板。该模板包含在内置 CMDUI.xml 功能区声明中。在功能区自定义项功能中定义自定义组时,Microsoft 建议开发人员创建其自己的组模板,而不是使用提供的组模板之一。这样做的原因是,SharePoint 不会为每个页面请求加载整个功能区;而只加载当前上下文所需的部分功能区。这包括组模板。因此,如果开发人员依赖内置组模板,则可以不为当前页面加载模板且不显示其功能区自定义项。

对于此示例自定义项,由于这是 Web 部件的一部分,并且 Web 部件必须位于 Web 部件页上,因此,假定将加载此模板,因为它是每个 Web 部件页上都具有的“页面”选项卡的一部分。

有关如何查找其他模板的名称的信息,请参阅本文后面的自定义 SharePoint 2010 Server 功能区开发提示和技巧。

步骤 2.5:向组添加控件 定义功能区自定义项的可见部分的最后一个步骤是向组添加控件。将以下标记添加到第二个组(请参阅 MSDN 示例 - 自定义和扩展 SharePoint 2010 Server 功能区(该链接可能指向英文页面),以将按钮添加到第一个组)。

XML复制                                                             ...                                              

转载于:https://www.cnblogs.com/Reedzhang/archive/2012/10/19/2731341.html

你可能感兴趣的:(自定义SharePoint 2010 功能区)