Проблема с добавлением пользовательской веб-части контекстной вкладки ленты - PullRequest
1 голос
/ 22 января 2011

Следуйте примеру, показанному в 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;
   ...
}

Ответы [ 2 ]

0 голосов
/ 26 января 2011

В итоге я сгенерировал уникальный контекстный идентификатор группы и последовательность с расширением XML с пользовательской веб-частью, чтобы избежать этой ошибки. Это, однако, добавило две контекстные группы / вкладки на ленту, когда две веб-части добавлены на страницу.

0 голосов
/ 24 января 2011

Похоже, вы дважды добавляете TabGroup в коллекцию лент.Всегда добавляйте код добавления, чтобы проверить, добавлена ​​ли группа вкладок.

if (!ribbon.IsTabAvailable(yourid)) {
    ribbon.MakeTabAvailable(yourid);
}

Так выглядит код добавления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...