Как добавить заголовок панели команд строки Excel с текстом и значком с помощью С#

Мне нужно добавить заголовок группы на панель команд Excel во время выполнения с помощью C#, чтобы я мог отделить параметры Office.CommandBarButton от параметров Excel по умолчанию. Например, в Excel 2013, если вы пойдете и выберете строку и ПКМ (правая кнопка мыши), отобразится панель команд по умолчанию со многими параметрами. Вы заметите, что есть заголовок «Параметры вставки:» со стандартным значком вставки слева. Я хочу создать аналогичный заголовок (группу), например «Параметры вставки:», используя С#.

Кстати, я использую следующий пример кода, чтобы успешно добавить несколько параметров Office.CommandBarButton в Excel;

    private void AddMyRowMenu() 
    {
       Office.CommandBars commandBars = null;
       Office.CommandBar commandBarRowMenu = null;
       Office.CommandBarButton commandBarButtonMyOptions1;
       try
       {
           commandBarRowMenu = commandBars["Row"];
           commandBarButtonMyOptions1 = (Office.CommandBarButton)commandBarRowMenu.Controls["My Option 1"];
       }
       catch (ArgumentException)
       {
           commandBarButtonMyOptions1 = (Office.CommandBarButton)commandBarRowMenu.Controls.Add(Office.MsoControlType.msoControlButton, oMissing, oMissing, oMissing, oMissing);
           commandBarButtonMyOptions1.BeginGroup = true;
           commandBarButtonMyOptions1.Caption = "My Option 1";
       }
       commandBarButtonMyOptions1.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(commandBarButtonMyOptions1_Click);
    }

Я добавляю 3 параметра Office.CommandBarButton, используя приведенный выше код, и мне нужно отделить их от параметров Excel RMB по умолчанию для ясности.


person Shanon Fernando    schedule 25.01.2019    source источник
comment
Начиная с Office 2007 объектная модель CommandBar устарела — вместо этого лента предоставляет командный интерфейс в более новых версиях Office. Итак, вам нужно исследовать ленту. По-видимому, вы имеете в виду контекстные меню (щелчок правой кнопкой мыши): их также можно изменить с помощью Ribbon XML. VSTO поддерживает ленточный XML.   -  person Cindy Meister    schedule 27.01.2019
comment
@CindyMeister: Спасибо, Синди. Я исследовал использование Ribbon.xml, но по-прежнему невозможно реализовать «Параметры вставки»: как контекстное меню со значком слева. Кроме того, мои кнопки контекстного меню добавляются динамически в зависимости от условий, поэтому я считаю, что это невозможно реализовать с помощью Ribbon.xml. Так или иначе, мне пришлось довольствоваться реализацией простого контекстного меню с помощью VSTO. Это было достигнуто путем определения всплывающего меню с типом «Office.MsoControlType.msoControlPopup».   -  person Shanon Fernando    schedule 05.02.2019
comment
Вам просто нужно иметь в виду, что объектная модель устарела — в какой-то момент она может перестать поддерживаться в будущей версии программного обеспечения. Насколько я помню, этот подход больше не работает, например, в PowerPoint или Word.   -  person Cindy Meister    schedule 05.02.2019


Ответы (1)


По данным Microsoft, для работы с https://docs.microsoft.com/en-us/office/vba/api/office.msocontroltype Ниже приведен мой пример кода, используемый для реализации контекстного меню.

private void AddMyRowMenu2() 
{
   Office.CommandBars commandBars = null;
   Office.CommandBar commandBarRowMenu = null;
   Office.CommandBarPopup commandBarRowPopupMenu = null;
   Office.CommandBarButton commandBarButtonMyOptions1 = null;
   Office.CommandBarButton commandBarButtonMyOptions2 = null;
   try
   {
       commandBars = (Office.CommandBars)Application.GetType().InvokeMember("CommandBars", System.Reflection.BindingFlags.GetProperty, null, Application, new object[] { });
       commandBarRowMenu = commandBars["Row"];
       commandBarRowPopupMenu = (Office.CommandBarPopup)commandBarRowMenu.Controls.Add(Office.MsoControlType.msoControlPopup, oMissing, oMissing, oMissing, oMissing);
       commandBarRowPopupMenu.Caption = "My Popup Menu 1";
       commandBarButtonMyOptions1 = (Office.CommandBarButton) commandBarRowPopupMenu.Controls.Add(Office.MsoControlType.msoControlButton, oMissing, oMissing, oMissing, oMissing);
       commandBarButtonMyOptions1.Caption = "My Button Option 1";
       commandBarButtonMyOptions2 = (Office.CommandBarButton) commandBarRowPopupMenu.Controls.Add(Office.MsoControlType.msoControlButton, oMissing, oMissing, oMissing, oMissing);
       commandBarButtonMyOptions2.Caption = "My Button Option 2";
   }
   catch (ArgumentException ex)
   {
       MessageBox.Show(ex.Message, "Test Menu Items", MessageBoxButtons.OK, MessageBoxIcon.Warning);
   }
   commandBarButtonMyOptions1.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(commandBarButtonMyOptions1_Click);
   commandBarButtonMyOptions2.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(commandBarButtonMyOptions2_Click);
}
person Shanon Fernando    schedule 05.02.2019