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