#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. Нет, это неправильно, просто. Ответ с наибольшим количеством голосов является правильным решением, насколько я могу видеть.