У меня есть лента VSTO Addin, которую я создал с XML, а не с дизайнером. У него есть кнопка на нем, которую я хочу включить только в том случае, если пользователь находится в диапазоне, который элемент управления добавляет.
У меня есть функция обратного вызова, которая отлично работает при загрузке ленты.
Код Ribbon1.cs
public bool refreshButtonState;
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
this.ribbon = ribbonUI;
refreshButtonState = false;
ribbon.InvalidateControl("btnRefreshQuery");
}
public bool refreshEnabled(Office.IRibbonControl control)
{
return refreshButtonState;
}
Я захватил событие изменения рабочего листа, чтобы отслеживать диапазон, в котором находится пользователь.
Код ThisAddIn.cs
void ThisWorkbook_SheetChange(object ws, Excel.Range rng)
{
//Disable Button state here.
if (rng.ListObject != null)
{
if (rng.ListObject.Name.StartsWith(LO_PREFIX))
{
//Enable Button state here.
}
}
}
Я не могу просто Globals.Ribbon.Ribbon1
ленту из Globals.Ribbon.Ribbon1
как это было много раз предложено в проведенном мной исследовании. Использование конструктора XML не предоставляет этой функции.
Кажется, что большая часть работы переносит мои функции прослушивания листа на ленту, для меня они принадлежат к аддину, а не к ленте, так как они предоставляют другие функции для добавления. Вероятно, я пропустил что-то очевидное, но существующая документация почти не существует. Помимо груды вопросов форума, на которые не ответит консультант или ответчик.
TL;DR: изменение свойства и invaldate элемент управления RibbonX из кода, который не является частью класса ленты.
Я понял. Или, по крайней мере, способ добраться туда. Я думал о парковке слушателя в классе Ribbon для события в классе Addin.
Я использовал это как ссылку.
В моем классе ThisAddin
я создал событие.
public delegate void UpdateRibbon(object source, StateChangeArgs e);
public event UpdateRibbon OnUpdateRibbon;
И класс EventArgs
public class StateChangeArgs : EventArgs
{
private bool EventInfo;
public StateChangeArgs(bool state)
{
EventInfo = state;
}
public bool GetInfo()
{
return EventInfo;
}
}
Добавлен прослушиватель и определит ленту
Globals.ThisAddIn.OnUpdateRibbon +=new ThisAddIn.UpdateRibbon(ThisAddIn_OnUpdateRibbon);
А также
public void ThisAddIn_OnUpdateRibbon(object a1, StateChangeArgs e)
{
refreshButtonState = e.GetInfo();
ribbon.InvalidateControl("btnRefreshQuery");
}
Затем поднял событие в Addin
OnUpdateRibbon(this, new StateChangeArgs(true));
Работает отлично /flex.