在本系列文章中:
- 定制功能区–创建选项卡,组和控件
- 将功能区项目添加到现有选项卡/组中
- 功能区自定义-下拉控件,客户端对象模型和JavaScript页面组件
- 通过Web部件和现场控件以编程方式自定义功能区(本文)
与我之前的文章相比,本文是’t详细的演练–而是,它是一种技术和信息的汇编,应该可以帮助您为Web部件,自定义字段控件甚至其他任何类型的页面控件实现功能区自定义。在撰写本文时,我还没有’除了一些资源,我确实看到了很多关于此的文章’会提到。我很想在这里写详细的演练,但是a’这是因为a)微软最近针对其中一种情况发布了一些很好的信息,所以我’d希望指出这一点,b)要深入研究这里的所有场景,将需要数周的时间,而c)因为如果我不这样做’我不要再停止写丝带了’明年这个时候我仍然会在这个话题上,坦率地说,我有一个 这本书的一章将在完全不同的SharePoint 2010领域上写,我需要继续学习!所以我们’我会看每一个要求’讨论我认为您的关键技术是什么’d结合我的一些观察来使用。
请注意,由于到目前为止,有关该主题的文档普遍缺乏(而且我还没有’(在所有情况下都将一切都触底了),这里有几件事是猜测,而不是确凿的事实。一世’请澄清这些内容,并会尽力回到本文并在出现新信息时添加更新。
在我们潜入之前,请记住,如果您’遵循功能区设计原则,您最有可能应该使用ContextualGroup(在 将功能区项目添加到现有选项卡/组中) –这是用于功能区元素的容器,这些功能区仅根据用户正在执行的操作才相关(显示为可见,但此处未激活):
如果不是’注意,如果您只需要在现有选项卡或组上添加一些在某些情况下被激活的控件,则可能会更容易。在这种情况下,您只需向‘EnabledScript’控件的属性–我在的“通知/状态”演示中展示了这一点 自定义功能区(第1部分)–创建选项卡,组和控件. 的rest of this article focuses on how 您 might get a contextual group (see image above) to show in different scenarios.
从Web部件添加功能区项目
在SharePoint 2010中,Web部件框架现在具有用于功能区自定义的特殊规定,这意味着需要为您处理几件事。 Microsoft现在以SharePoint开发人员文档博客上的文章形式发布了有关此方案的一些指导- 如何使用上下文选项卡创建Web部件 。那里’里面有很多黄金信息,但是我’我将在这里说明要点:
- 使用服务器端代码,‘RegisterDataExtension’SPRibbon的方法可用于将XML传递到功能区框架。
- 这是使用CustomAction元素的完全声明方法的替代方法。据我所知,这两种技术都只能用于特定于某个控件的功能区自定义(这与功能区自定义(例如,要使用CustomAction的特定类型的所有列表相对)相反)。
- Your web part needs to implement 的new IWebPartPageComponentProvider 接口和它’s WebPartContextualInfo 属性
- This allows 您 to specify information about 的associated ribbon customization(s) and 的ID of 的associated 页面组件 (which we discussed 上次)作为您的自定义位。 这使功能区框架能够‘link’功能区更改您的Web部件–意味着某些事情会为您照顾,例如仅当您的Web部件将焦点放在页面上时才触发命令(如果您通过使用‘getFocusedCommands’ in 您r 页面组件). Without this 您 would have to write 的JavaScriptcode to manually handle page events for controls emitted by 您r web part e.g. 的click event for a textbox.
从字段控件添加功能区项目
像网络部件一样,我 认为 (在此处推测)框架中有特殊的规定,用于从现场控件进行功能区定制。考虑到,就像Web部件一样,字段控件通常只在具有焦点时才显示其上下文功能区选项-因为所有字段控件都属于这种情况,所以我认为Microsoft可以为我们抽象一些处理方法对我来说很有意义。如果不, 您 将负责编写JavaScript来检测用户何时单击您的字段,以便您可以显示ContextualGroup。
仔细研究一下,我注意到所有SharePoint字段控件都具有4个新属性(因为它们是在一个基类上实现的, Microsoft.SharePoint.WebControls.FormComponent):
- RibbonTabCommand
- RibbonContextualGroupCommand
- RibbonGroupCommand
- 功能区命令
I’m surmising that these control properties would be set declaratively in 的hosting page and are designed to match up with commands specified in an accompanying 页面组件 - this would enable 您 to run client-side code similar to my sample 上次, perhaps to 初始化 data for 您r ribbon controls and so on. However, when I try to implement these commands, my 页面组件’s ‘handleCommand’方法从不接收这些命令。所以我’我做错了什么或这个理论不正确。在这种情况下,不必担心仍可以完全实现针对现场控制的功能区定制,这将需要做更多的工作。继续阅读。
使用服务器端代码显示功能区项目
超越任何思维‘framework support’对于我们的功能区定制针对的目标,我们始终可以编写服务器端或客户端代码以显示上下文组。实际上,我已经在其中显示了服务器端代码 将功能区项目添加到现有选项卡/组中(功能区定制第2部分):
protected override void OnPreRender(EventArgs e)
{
SPRibbon currentRibbon = SPRibbon.GetCurrent(this.Page);
currentRibbon.MakeTabAvailable("COB.SharePoint.Ribbon.ContextualTab");
currentRibbon.MakeContextualGroupInitiallyVisible("COB.SharePoint.Ribbon.ContextualGroup", string.Empty);
base.OnPreRender(e);
}
这可能仅在您的内容与上下文相关时才适用-ish –应用程序页面将是一个很好的例子。在此示例中,我们只关心用户在页面上,然后我们可以显示我们的选项。它没有’无论哪个控件具有焦点,实际上,我们的选项都可以在页面加载时默认显示。但是,如果您需要页面级‘contextuality’(我可能只是顺便发明了这个词-今天在给老板的一句话中使用它)然后很可能是您’当用户在页面上执行特定操作时,例如,希望使用JavaScript来显示您的上下文组。编辑某个字段。您’d然后寻找一些客户端代码来检测到这一点并做出相应的响应。
使用客户端代码显示功能区项目
所以,最后一种情况-如果您需要显示来自某些东西的功能区项目怎么办’一个Web部件或现场控件(或者像我一样,’不能在现场控制框架中提供任何可能会或可能不会有帮助的东西),并且必须在客户端将其完全上下文化?好吧,我很失望’我到目前为止在这里画了另一个空白– I’d很乐意听到知道答案的任何人。万一你’重新进行功能区开发并且对此感兴趣,在这里’我的旅程摘要:
- 在客户端OM中检查了SP.Ribbon名称空间
- 在调试器和各种现成的JavaScript文件中度过了许多欢乐时光,以查找核心产品执行此操作的示例(例如日历,富文本编辑器,仅举几例)
- 在CUI.Ribbon对象上找到了一些有趣的方法,例如showContextualGroup(‘foo’)和selectTabByCommand(‘bar’)
- 请注意,在整个SharePoint根目录中,这些方法仅由RTE调用,而不在SharePoint代码库中全局调用
- 注意,RTE代码从属性(RTE.RichTextEditorComponent。$ 3b()获得一个CUI.Ribbon实例。–N.B.大部分JS都是经过混淆或机器生成的*)
- 试图使用SP.Ribbon.PageManager.get_instance()。get_ribbon()(在OOTB代码库中的其他位置使用)为我提供CUI.Ribbon实例,但是这给了我一个空值
- 尝试使用‘_ribbon’页面级变量,但是它似乎不是CUI.Ribbon类型,因为调试器显示它没有方法I’m trying to call
- 我尝试了其他几件事’ve forgotten now
不用说,我’d喜欢听到我的声音’我对此不见了。如果没有其他要求,希望MS会尽快发布更多信息,这将为如何处理此情况提供一些启示。
概要
这篇文章没有’声称拥有所有答案,但它可以作为“leg up" if 您’现在尝试构建任何这些方案。一世’我希望这方面缺乏深入的信息反映出RTM尚需时日,并且功能开发人员会不时地从SDK中获得一些喜爱。我在这里讨论的关键场景是显示来自Web部件和字段控件的自定义功能区元素,还显示了使用服务器或客户端代码显示自定义项的更一般的情况。
如果您可以在此处覆盖我的报道中的空白,请随时发表评论。