Sharepoint功能区:规避上下文敏感度

时间:2012-04-16 13:29:04

标签: c# javascript sharepoint ribbon

我是sharepoint开发的新手,我正在尝试修改Sharepoint功能区的行为。众所周知,功能区是这样的,当其他东西获得焦点时(例如列表项),功能区会自动切换到适当的选项卡或选项卡组(例如“列表工具”选项卡组)。

我想禁用此标签的常量切换,并使浏览标签始终为活动标签,除非用户明确点击其他标签。

我已尝试在Usercontrol的Page_Load()中执行以下操作,但只在初始加载页面时才能执行一次。我究竟做错了什么?更重要的是,如果有的话,我该怎么做呢?

基本上,我希望有人可以指出我在上下文发生变化并且功能区切换时触发的事件,以及我如何连接到此事件并强制功能区切换回浏览选项卡。

protected void Page_Load()
        {
            string showBrowseTabScript = string.Empty;
            showBrowseTabScript = @"
                                function ShowBrowseTab() {

                                         var ribbon = SP.Ribbon.PageManager.get_instance().get_ribbon();
                                         SelectRibbonTab(""Ribbon.Read"", true);
                                      }

                                      SP.SOD.executeOrDelayUntilScriptLoaded(function() {

                                         var pm = SP.Ribbon.PageManager.get_instance();
                                         pm.add_ribbonInited(function() {

                                            ShowBrowseTab();
                                         });

                                         var ribbon = null;
                                         try
                                         {
                                            ribbon = pm.get_ribbon();

                                         }

                                         catch (e) { }

                                         if (!ribbon) {

                                            if (typeof(_ribbonStartInit) == ""function"")

                                               _ribbonStartInit(_ribbon.initialTabId, false, null);
                                         }
                                         else {

                                            ShowBrowseTab();
                                         }

                                      },

                                      ""sp.ribbon.js"");
                                ";
            this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "BrowseTabScript", showBrowseTabScript, true);
        }

2 个答案:

答案 0 :(得分:1)

以下是我对问题的解决方案,万一有人感兴趣。

考虑到Ken Henderson的建议,我能够实现我一直想做的事情,尽管我通过修改SP.Ribbon.js和SP.Ribbon.debug.js文件的代码实现了这一点。我正在使用SP.Ribbon.debug.js在下面显示我的解决方案,因为它不像SP.Ribbon.js那样神秘。

基本上,我使用下面的代码来欺骗功能区,使其认为用户位于不同的选项卡上并单击了“浏览”选项卡。您会注意到我在代码中设置了旧选项卡信息。如果没有我这样做,它仍然可以工作,但我这样做是为了防止功能区需要那些我不知道的其他信息。这段代码与我在第一篇文章中发布的Page_Load()函数相结合,使得功能区的行为就像我需要的那样。

SP.Ribbon.PageManager.prototype = {

    executeRootCommand: function (commandId, properties, commandInfo, root) {
        ULSMg8: ;
        var $v_0;
        if (!SP.ScriptUtility.isNullOrUndefined(commandInfo) && commandId !== 'RibbonEvent' && (commandId !== 'CommandContextChanged' || (!SP.ScriptUtility.isNullOrUndefined(properties) && properties['ChangedByUser']))) {
// My changes to SP.Ribbon

if (properties["ChangedByUser"] === false) {
            properties["ChangedByUser"] = true;
            var $NewContextId = properties["NewContextId"];
            var $NewContextCommand = properties["NewContextCommand"];
            properties["OldContextId"] = $NewContextId;
            properties["OldContextCommand"] = $NewContextCommand;
            properties["NewContextId"] = "Ribbon.Read";
            properties["NewContextCommand"] = "ReadTab";
            SelectRibbonTab("Ribbon.Read", true);
        }

// End of changes to SP.Ribbon

            // the rest of the code has been ommitted for clarity
        return $v_0;
    }
}

答案 1 :(得分:0)

据我所知,SharePoint不会公开任何事件以检测功能区选项卡何时更新(选项卡添加/删除或哪些是活动的)。至少我几周前找不到任何东西,当我试图检测何时添加/删除标签时(我不关心哪个是活动的只是它们的数量/宽度)。

(很抱歉由于缺乏详细信息,目前办公室的SharePoint开发环境不可用,因此我无法轻易查找详细信息。)

解决这个问题有两种可能性(每种都有风险/问题):

覆盖JS功​​能

了解当用户点击更新功能区的项目时调用的JavaScript函数。您可以使用自己的函数替换该函数,从而提供所需的行为。这在概念上类似于在窗口上滚动并且必须改变宽度大小的行为的自定义母版页。我目前无法验证细节,但看起来该函数在core.js中被称为SingleItemSelect。

如果您有何时可以覆盖此行为,并且如果MS在将来更改任何内容,您实施可能会中断和/或需要更新,则可能会出现此问题。

添加您自己的事件处理程序

在JavaScript代码中尝试查找适当的DOM事件,以便在功能区中附加事件处理程序,以检测MS的代码何时更改功能区。鉴于DOM事件的局限性,很可能没有事件来附加处理程序。您可能最终添加一个定期调用的函数(轮询循环/计时器),该函数检测功能区选项卡更改并重置活动选项卡。

老实说这不会很好用,因为MS的功能区代码会更改活动选项卡并且您将其更改回来会闪烁。此外,您需要检测用户何时单击选项卡,以便您不撤消其更改。

总结

老实说,我会推迟并更改此要求,以便功能区行为按照MS设计的方式工作,而不是试图对抗它。如果在用户点击某个项目时显示的功能区确实存在问题,那么我建议客户端不要强制Browse选项卡处于活动状态,而是在允许功能区的功能区区域添加其他链接(或至少扩展到标题区域的部分)被切换为隐藏/显示,与MS的JavaScript对功能区的操作无关。