1

デザイナーではなく、XML で作成した VSTO アドイン リボンがあります。ユーザーがアドインが制御する範囲内にいるときにのみ有効にしたいボタンがあります。

リボンがロードされたときに正常に動作するコールバック設定があります。

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私が行った調査で何度も提案されているように、リボンを拾うことはできません. XML デザイナを使用しても、この機能は許可されません。

シートのリッスン機能をリボンに移動するのは大変な作業のように思えます。アドインに他の機能を提供するため、とにかくリボンではなくアドインに属しています。明らかな何かが欠けている可能性がありますが、存在するドキュメントはほとんど存在しません。質問者または回答者がそれを理解できないフォーラムの質問の山以外。

TLDR: リボン クラスの一部ではないコードから、プロパティを変更し、RibbonX コントロールを無効にします。

4

1 に答える 1

2

私はそれを考え出した。または、少なくともそこにたどり着く方法。Addin クラスのイベントのために、Ribbon クラスにリスナーを駐車することを考えていました。

これを参考にしました。

私の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");

    }

次に、アドインでイベントを発生させました

OnUpdateRibbon(this, new StateChangeArgs(true));

うまく機能します/フレックス。

于 2014-05-27T18:34:20.540 に答える