Добавление элементов в RibbonDropDown во время выполнения

#c# #visual-studio-2010 #vsto #outlook-2007

#c# #visual-studio-2010 #vsto #outlook-2007

Вопрос:

Итак, у меня есть выпадающее меню на ленте с содержимым, которое можно изменять во время его использования. Outlook также с радостью позволяет мне «добавлять» или «вставлять» в него элементы, при условии, что я добавляю не более 1 элемента.

Если я попытаюсь, мне скажут, что индекс выходит за рамки, вместо того, чтобы расширять верхние границы для меня.

Я обнаружил, что если я вставлю это в коллекцию в дизайнерской части кода, это будет работать нормально, но дизайнерский код запускается только один раз, если я не удалю ленту и не создам ее заново.

Есть идеи относительно того, как я могу заставить это работать

Ответ №1:

Попробуйте это. Это должно сработать для вас.

 RibbonDropDownItem item 
      = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
item.Label = "First Name";
this.cbRecent.Items.Add(item);
  

Комментарии:

1. Здравствуйте …. если выпадающий список содержит кнопку, элементы добавляются перед кнопкой …. есть ли способ добавить элементы после кнопок?

2. Ничего не стоит, что this.cbRecent.ShowItemLabel = true; нужно было бы установить, и почему-то это не было по умолчанию в моей настройке. Очевидно, cbRecent вот поле со списком

3. что, если нам нужна пара ключ-значение? похоже, для этого у нас есть только «label»?

Ответ №2:

Попробуйте следующее непосредственно внутри класса Ribbon:

 RibbonDropDownItem item = this.Factory.CreateRibbonDropDownItem();
item.Label = "Text";
combo.Items.Add(item);
  

Комментарии:

1. Ответ кажется хорошим, но не могли бы вы предоставить немного описания? Это было бы очень полезно!

2. что, если нам нужна пара ключ-значение? похоже, для этого у нас есть только «label»?

3. Немного поздно, но если вы хотите сохранить данные и ссылаться на них с помощью «ключа», вы можете использовать .Label свойство в качестве ключа, а .Tag свойство — в качестве значения (может быть переменной данных или даже объектом)

Ответ №3:

господа, ваш подход не работает с «новым». Вы должны использовать «Глобальные переменные.Factory.GetRibbonFactory().CreateRibbonDropDownItem()». В остальном вы правы, и ваш подход отлично работает с RibbonGallery.

Этот подход также отлично работает с выпадающим списком. Я все еще часто конфликтую по поводу того, какой из них использовать…

Однако, кроме этих двух объектов (Dropdown и RibbonGallery), я считаю, что drventure является правильным. Вам просто нужно заглушить объекты заранее и использовать их по мере необходимости.

Вы также можете использовать XML-ленту, но это создает еще больший набор головных болей (по крайней мере, для моих вариантов использования).

Ответ №4:

Попробуйте использовать галерею ленты. Я смог модифицировать их во время выполнения всего за

 foreach (string s in list)
{
     RibbonDropDownItem item = new RibbonDropDownItem();                
     item.Label = s;
     rGallery.Items.Add(item);                
}
  

где rGallery — это RibbonGallery.

Комментарии:

1. Я не вижу необходимости заменять выпадающий список RibbonGallery — ваш метод работает так же хорошо с выпадающим списком. Смотрите ответ Садана и судира.

Ответ №5:

Вообще говоря, VSTO хочет, чтобы вы полностью описали нужные вам элементы пользовательского интерфейса один раз, в самый первый раз, когда вас попросят о них (через GetCustomUI).

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

Затем программно СКРОЙТЕ или ПОКАЖИТЕ эти элементы и обновите их подписи и другие свойства по мере необходимости во время выполнения вашего дополнения.

Таким образом, вам никогда не придется динамически добавлять или удалять что-либо.

Комментарии:

1. Нет проблем. Это немного странно и халтурно, и это может немного усложнить определенный класс функций, но, насколько я знаю, это, пожалуй, единственный выбор, который у вас есть.

2. Если я не ошибаюсь, этот ответ просто ложный. Смотрите другие ответы.

3. Возможно, но в двух приведенных примерах явно не упоминается выполнение этого кода где-либо после начальной загрузки пользовательского интерфейса ribbon. С чем я столкнулся, так это с проблемами при попытке изменить элементы пользовательского интерфейса после выполнения GetCustomUI и всех функций инициализации. Тем не менее, другие ответы определенно стоит изучить. Но я не думаю, что мой ответ был «неправильным» сам по себе, просто альтернативный (и гарантированно функциональный) способ сделать то, что запрашивал op, без большой головной боли.

4. Нет, это неправильно, просто. Ответ с наибольшим количеством голосов является правильным решением, насколько я могу видеть.