Как добавить кнопку на ранее существовавшую вкладку на ленте (С#)?

Я успешно создал новую вкладку и разместил ее рядом с уже существующими. Затем я понял, что на нем будет только одна кнопка, поэтому теперь имеет смысл (на данный момент) разместить ее на вкладке "Главная". На самом деле это не помогло.

Я пытался следить за гидами и прогулочными корытами. Я получил XML и изменил его XML на следующие.

<tabs>
  <!--<tab idMso="TabAddIns">-->
  <tab idMso="TabHome">
    <group id="group1" label="Hazaa!">
      <box id="box1" />
    </group>
  </tab>
</tabs>

Когда я запускаю проект, я не получаю никаких изменений в пользовательском интерфейсе, поэтому я думаю, что либо:

  • XML не читается вообще,
  • неверно имя TabHome (по крайней мере, для Outlook 2010),
  • атрибут idMso неверен (по крайней мере, для Outlook 2010) или
  • другое/сочетание любого из указанных.

Что я могу сделать, чтобы изменить ленту? (Outlook 2010/VSTO/VS 2010/.NET 4).

Ответ 1

Атрибут idMso верен, но идентификатор нужной вкладки TabMail. Вы можете найти упакованный набор файлов Excel, содержащих списки идентификаторов управления Office 2010 в MSDN. Затем, как упоминалось в комментарии к вопросу, в вашем образце XML могут отсутствовать теги customUI и ленты. (Отказ от ответственности: я не настроил ленту в Outlook, только Word, Excel и PowerPoint, но я бы предположил, что они работают одинаково?)

Попробуйте что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    <ribbon>
        <tabs>
            <tab idMso="TabMail">
                <group id="group1" label="Hazaa!">
                    <box id="box1" />
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

Ответ 3

Под ред. Извините, дал ссылку dnn. Вы хотите офис и хотите С#.

Здесь ответ StackOverflow в VBA... Как получить индивидуальные идентификаторы вкладок ленты?

AccessibleChildren _
            Lib "oleacc.dll" _
                (ByVal paccContainer As Object, _
                 ByVal iChildStart As Long, _
                 ByVal cChildren As Long, _
                       rgvarChildren As Variant, _
                       pcObtained As Long) _
            As Long

Что в С# переводит на

[Lib "oleacc.dll"]
Long AccessibleChildren(object paccContainer, 
                        long iChildStart, 
                        long cChildren, 
                        object rgvarChildren, 
                        long pcObtained)...

Я никогда не пробовал, поэтому не уверен, что это работает.

Из всей другой документации, кажется, вы просто получаете ленточный объект, и в нем итерации (с помощью foreach) через все дочерние элементы

Ответ 4

Если люди разочарованы тем, что ни один из других ответов не работает, перейдите к свойствам самой ленты и установите для RibbonType значение Microsoft.Outlook.Explorer (или любой RibbonType контекст, в котором вы хотите видеть элемент управления). Это важный шаг, который легко пропустить.

Затем следуйте другим инструкциям, чтобы установить OfficeId на TabMail.

Кроме того, Office 2016 Fluent Control Identifiers можно найти здесь: https://www.microsoft.com/en-us/download/confirmation.aspx?id=50745.