1

我是 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);
        }
4

2 回答 2

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;
    }
}
于 2012-04-18T12:47:33.010 回答
0

据我所知,SharePoint 不会公开任何事件来检测功能区选项卡何时更新(添加/删除选项卡或处于活动状态)。至少几周前,当我试图检测何时添加/删除选项卡时,我找不到任何一个(我不在乎哪个是活动的,只是它们的数量/宽度)。

(抱歉,缺少详细信息,办公室的 SharePoint 开发环境暂时不可用,所以我不能很容易地查找详细信息。)

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

覆盖 JS 功能

找出当用户单击更新功能区的项目时调用的 JavaScript 函数。您也许可以用您自己的功能替换该功能,以提供您想要的行为。这在概念上类似于在窗口上滚动并且必须更改宽度调整行为的自定义母版页。我目前无法验证详细信息,但看起来该函数在 core.js 中称为 SingleItemSelect。

如果您对何时覆盖此行为有例外,并且如果 MS 将来更改任何内容,您的实施可能会中断和/或需要更新,这可能是一个问题。

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

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

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

包起来

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

于 2012-04-17T13:17:30.750 回答