Следуйте примеру, показанному в http://blog.dennus.net/2010/07/20/ribbon-buttons-with-postback-in-sp2010/,, вместо использования декларативного подхода в этом примере, я создал собственный класс веб-частей и зарегистрированное расширение данных ленты, сценарий pageComponent и т. Д. Во время события OnPreRender.
Кажется, все работает нормально, моя контекстная группа / вкладка / элемент управления отображается при отображении страницы веб-части. Однако, если я добавлю две мои собственные веб-части на одну и ту же страницу, я столкнулся с ошибкой: ArgumentException: элемент уже был добавлен. Введите словарь: «Ribbon.MyContextualTabGroup» Добавляемый ключ: «Ribbon.MyContextualTabGroup»].
Как мне избежать этой проблемы? Каков наилучший подход? В идеале мне бы хотелось, чтобы контекстная группа / вкладка / элемент управления ленты отображалась по-разному, когда выбрана другая настраиваемая веб-часть на странице, но я упустил, как эта часть работает в инфраструктуре ленты SharePoint 2010.
В попытке обнаружить, что первая веб-часть на странице, возможно, зарегистрировала контекстную группу, я попробовал SPRibbon.IsTabAvailable (tabID), но это всегда возвращает меня к истине - даже до того, как я фактически добавил расширение данных вкладки XML. Я довольно смущен. Примечание. Я не использовал подход развертывания пользовательских действий / функций, но динамически регистрировал расширение данных ленты и компонент страницы.
Ниже приведен фрагмент кода, показывающий, как я добавил ленту:
Microsoft.Web.CommandUI.Ribbon ribbon = SPRibbon.GetCurrent(theWebPart.Page);
if (ribbon != null)
{
// register data extension
XmlDocument ribbonExtensions = new XmlDocument();
ribbonExtensions.LoadXml(ContextualGroupInfo.ToXml());
ribbon.RegisterDataExtension(ribbonExtensions.FirstChild,
"Ribbon.ContextualTabs._children");
// Register initialize function
var manager = new SPRibbonScriptManager();
var methodInfo = typeof(SPRibbonScriptManager).GetMethod(
"RegisterInitializeFunction",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
methodInfo.Invoke(manager, new object[]
{
webPart.Page,
"InitPageComponent",
"/_layouts/PageComponent.js",
false,
"RibbonCustomization.PageComponent.initialize()"
});
var commands = new List();
commands.Add(new SPRibbonCommand(ContextualGroup.EnableContextualGroupCommand));
commands.Add(new SPRibbonCommand(ContextualTab.EnableContextualTabCommand));
...
// add ribbon button commands
...
// initialize tab
ribbon.Minimized = false;
ribbon.CommandUIVisible = true;
if (!ribbon.IsTabAvailable(ContextualTab.ID))
{
ribbon.MakeTabAvailable(ContextualTab.ID);
ribbon.EnableVisibilityContext(ContextualTab.VisibilityContext);
ribbon.MakeContextualGroupInitiallyVisible(ContextualTabGroupID, string.Empty);
ribbon.NormalizeContextualGroup(ContextualTabGroupID, string.Empty);
}
// Make the tab active by default when the page is opened.
ribbon.InitialTabId = ContextualTab.ID;
...
}