Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sharepoint功能区:规避上下文敏感性_C#_Javascript_Sharepoint_Ribbon - Fatal编程技术网

C# Sharepoint功能区:规避上下文敏感性

C# Sharepoint功能区:规避上下文敏感性,c#,javascript,sharepoint,ribbon,C#,Javascript,Sharepoint,Ribbon,我是sharepoint开发新手,正在尝试修改sharepoint功能区的行为。大家都知道,功能区是这样的:当其他内容(例如列表项)获得焦点时,功能区会自动切换到相应的选项卡或选项卡组(例如“列表工具”选项卡组) 我想禁用选项卡的这种持续切换,并使浏览选项卡始终成为活动选项卡,除非用户明确单击另一个选项卡 我尝试在Usercontrol的Page_Load()中执行以下操作,但它只在最初加载页面时起作用一次。我做错了什么?更重要的是,我怎么能做得对呢 基本上,我希望有人能告诉我上下文改变和功能区

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

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

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

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

覆盖JS功能 了解当用户单击更新功能区的项目时调用的JavaScript函数。您可以用自己的函数替换该函数,该函数提供您想要的行为。这在概念上类似于在窗口上滚动的自定义母版页,并且必须更改宽度大小的行为。目前我无法验证细节,但在core.js中该函数名为SingleItemSelect

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

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

老实说,这不会很好地工作,因为当MS的功能区代码更改活动选项卡,而您的用户将其更改回活动选项卡时,会出现闪烁。此外,您还需要检测用户何时单击选项卡,以便您不会撤消他们的更改

收尾
老实说,我会回过头来改变这个要求,让ribbon的行为按照MS设计的方式工作,而不是试图反抗它。如果用户单击某个项目时出现的功能区确实是一个问题,那么我建议客户不要强制
浏览
选项卡处于活动状态,而是在功能区区域的某个位置添加一个额外的链接,以允许功能区(或至少是扩展到标题区域的部分)独立于MS的JavaScript对功能区所做的操作,将其切换为隐藏/显示。

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

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

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

覆盖JS功能 了解当用户单击更新功能区的项目时调用的JavaScript函数。您可以用自己的函数替换该函数,该函数提供您想要的行为。这在概念上类似于在窗口上滚动的自定义母版页,并且必须更改宽度大小的行为。目前我无法验证细节,但在core.js中该函数名为SingleItemSelect

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

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

老实说,这不会很好地工作,因为当MS的功能区代码更改活动选项卡,而您的用户将其更改回活动选项卡时,会出现闪烁。此外,您还需要检测用户何时单击选项卡,以便您不会撤消他们的更改

收尾
老实说,我会回过头来改变这个要求,让ribbon的行为按照MS设计的方式工作,而不是试图反抗它。如果用户单击某个项目时出现的功能区确实是一个问题,那么我建议客户不要强制
浏览
选项卡处于活动状态,而是在功能区区域的某个位置添加一个额外的链接,以允许功能区(或至少是扩展到标题区域的部分)独立于MS的JavaScript对功能区所做的操作,将其切换为隐藏/显示。

以下是我的解决方案,以备不时之需
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;
    }
}