Изменение состояния элементов управления ленты Office из других мест приложения в VSTO

1

У меня есть лента 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 из кода, который не является частью класса ленты.

Теги:
excel
vsto
ribbonx

1 ответ

2
Лучший ответ

Я понял. Или, по крайней мере, способ добраться туда. Я думал о парковке слушателя в классе 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню