Я создал ленту VSTO для надстройки Outlook 2010. Когда я ранее использовал конструктор, я мог динамически изменять метку кнопки ленты. Сейчас я кодирую это вручную (XML / C #) и, похоже, не могу определить, как сделать то же самое. Элемент «метка» в XML кажется статичным.
К вашему сведению - цель этого - определить количество элементов в галерее для пользователя.
Спасибо.
2 ответа
Существует атрибут getLabel , который вы можете установить для своего элемента. Значение - это имя функции обратного вызова, которая вызывается для динамического предоставления имени метки. Вы можете программно обновить пользовательский интерфейс, чтобы принудительно вызывать все ваши обратные вызовы.
Это должно работать для Excel и Outlook с использованием C #.
Я собираюсь предположить, основываясь на вашем вопросе, что вы можете создать большую часть xml, чтобы поместить кнопку на ленту, поэтому я пропущу эту часть. Вы также не упомянули, какое событие должно изменить кнопку метки, поэтому я предполагаю, что нажатие на кнопку вызовет изменение текста метки.
Сначала вставьте xml-код кнопки на место
<button id="YourUniqueId" onAction="YourUniqueId_Click" getLabel="GetYourLabelText">
Создайте переменную уровня класса, которая будет доступна для всех методов в вашем классе ленты перед конструктором, а затем установите значение в своем конструкторе. Вам также понадобится переменная класса пользовательского интерфейса ленты. Эта переменная должна быть создана при загрузке ленты с использованием метода загрузки в xml, например onLoad = "Ribbon_Load".
public class Ribbon: Office.IRibbonExtensibility
{
private bool _buttonClicked;
private Office.RibbonUI ribbon;
public Ribbon()
{
_buttonClicked = false;
}
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
ribbon = ribbonUI;
}
}
Затем в классе ленты вам понадобятся два класса «YourUniqueId_Click» и «GetYourLabelText».
public void YourUniqueId_Click(Office.IRibbonControl Control)
{
//Since the initial value is false and presumably the user just clicked for
//the first (or N-th) time you'll want to set the value to true
if(!_buttonClicked)
{
_buttonClicked = true;
}
//Or if clicking for a second (or N-th + 1) time, set the value to false
else
{
_buttonClicked = false;
}
//Now use the invalidate method from the ribbon variable (from the load method)
//to reset the specific control id (in this case "YourUniqueId") from the xml.
//Invalidating the control will call the method "GetYourLabelText"
ribbon.InvalidateControl(Control.Id);
}
public string GetYourLabelText(Office.IRibbonUI Control)
{
if(_buttonClicked)
{
return "Button is On";
}
else
{
return "Button is Off";
}
}
Метод «GetYourLabelText» будет запускаться при первоначальной загрузке ленты в Outlook или Excel. Поскольку для переменной класса «_buttonClicked» в конструкторе установлено значение false, метка кнопки будет начинаться как «Button is Off». Каждый раз, когда нажимается кнопка, "_buttonClicked" меняет логическое состояние, затем кнопка сбрасывается, снова вызывая метод "GetYourLabelText".
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.