none
[VSTO]リボンXMLを使ったトグルボタンの制御 RRS feed

  • 質問

  • 開発言語:C#
    ツール :Visual Studio2019
    Office :Power Point

    VSTOのトグルボタンの制御について質問があります。

    リボンXMLを使ってトグルボタンのAとBの2つを作成し、
    トグルボタンAをクリックしてONにしたら、トグルボタンBをOFFにして
    トグルボタンBをクリックしてONにしたら、トグルボタンAをOFFにするという処理を実装したいです。


    しかし、リボンXMLで作成したトグルボタンコンポーネントを
    Ribbon.cs内で扱うことが出来ない状況で困っています。
    Ribbon.cs内でトグルボタンコンポーネントの値を変更したいです。

    そこで質問したいことは、Ribbon.cs内でどのようにすれば

    トグルボタンコンポーネントを扱うことが出来るのかということです。


    調べたところ、トグルボタンコンポーネントにgetPressed属性をセットして
    トグルボタンコンポーネントを扱うというところまでは分かったのですが
    トグルボタンコンポーネントのオブジェクトを取得出来ません。

    【ソース C#】
        /// <summary>
        /// getPressedでセットした関数
        /// </summary>
        public void tglSample_getPressed(Office.IRibbonControl control)
        {
    //ここでトグルボタンの値を扱いたい

    //↓ビジュアルデザイナーの場合、下記のように値をセットできるがリボンXMLの場合出来ない
    this.FirstShape.Checked = false;
        }


    お手数をおかけして申し訳ございませんが、
    ご回答よろしくお願い致します。

                   
    2020年1月20日 6:27

回答

  • こんな

    <?xml version="1.0" encoding="UTF-8"?>
    <customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2009/07/customui">
      <ribbon>
        <tabs>
          <tab idMso="TabAddIns">
            <group id="group1" label="group1">
    
              <toggleButton label="A"
                            id="toggleButton_A" 
                            getPressed="tgl_getPressed"
                            onAction="tgl_onAction" />
    
              <toggleButton label="B"
                  id="toggleButton_B"
                  getPressed="tgl_getPressed"
                  onAction="tgl_onAction" />
    
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>
    namespace PowerPointAddIn1
    {
        using System;
        using System.IO;
        using System.Reflection;
        using System.Runtime.InteropServices;
        using Office = Microsoft.Office.Core;
    
        [ComVisible(true)]
        public class Ribbon : Office.IRibbonExtensibility
        {
            private Office.IRibbonUI ribbon;
    
            public Ribbon()
            {
            }
    
            #region IRibbonExtensibility のメンバー
    
            public string GetCustomUI(string ribbonID)
            {
                return GetResourceText("PowerPointAddIn1.Ribbon.xml");
            }
    
            #endregion
    
            #region リボンのコールバック
            //ここでコールバック メソッドを作成します。コールバック メソッドの追加について詳しくは https://go.microsoft.com/fwlink/?LinkID=271226 をご覧ください
    
            public void Ribbon_Load(Office.IRibbonUI ribbonUI)
            {
                this.ribbon = ribbonUI;
            }
    
            /// <summary>トグルボタンの状態を返すコールバック</summary>
            /// <param name="control"></param>
            /// <returns>トグルボタンのチェック状態</returns>
            public bool tgl_getPressed(Office.IRibbonControl control)
            {
                switch (this.state)
                {
                case ToggleState.A:
                    return control.Id == "toggleButton_A";
                case ToggleState.B:
                    return control.Id == "toggleButton_B";
                default:
                    return false;
                }
            }
    
            /// <summary>トグルボタンをクリックしたときのコールバック</summary>
            /// <param name="control"></param>
            /// <param name="pressed">クリック後のチェック状態</param>
            public void tgl_onAction(Office.IRibbonControl control, bool pressed)
            {
                if (control.Id == "toggleButton_A")
                {
                    state = pressed ? ToggleState.A : ToggleState.B ;
                    this.ribbon.InvalidateControl("toggleButton_B");
                }
                if (control.Id == "toggleButton_B")
                {
                    state = pressed ? ToggleState.B : ToggleState.A;
                    this.ribbon.InvalidateControl("toggleButton_A");
                }
    
            }
    
            private enum ToggleState
            {
                A,
                B
            }
            private ToggleState state = ToggleState.A;
    
            #endregion
    
            #region ヘルパー
    
            private static string GetResourceText(string resourceName)
            {
                Assembly asm = Assembly.GetExecutingAssembly();
                string[] resourceNames = asm.GetManifestResourceNames();
                for (int i = 0; i < resourceNames.Length; ++i)
                {
                    if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                        {
                            if (resourceReader != null)
                            {
                                return resourceReader.ReadToEnd();
                            }
                        }
                    }
                }
                return null;
            }
    
            #endregion
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク takuro1995 2020年1月20日 17:35
    2020年1月20日 12:33

すべての返信

  • こんな

    <?xml version="1.0" encoding="UTF-8"?>
    <customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2009/07/customui">
      <ribbon>
        <tabs>
          <tab idMso="TabAddIns">
            <group id="group1" label="group1">
    
              <toggleButton label="A"
                            id="toggleButton_A" 
                            getPressed="tgl_getPressed"
                            onAction="tgl_onAction" />
    
              <toggleButton label="B"
                  id="toggleButton_B"
                  getPressed="tgl_getPressed"
                  onAction="tgl_onAction" />
    
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>
    namespace PowerPointAddIn1
    {
        using System;
        using System.IO;
        using System.Reflection;
        using System.Runtime.InteropServices;
        using Office = Microsoft.Office.Core;
    
        [ComVisible(true)]
        public class Ribbon : Office.IRibbonExtensibility
        {
            private Office.IRibbonUI ribbon;
    
            public Ribbon()
            {
            }
    
            #region IRibbonExtensibility のメンバー
    
            public string GetCustomUI(string ribbonID)
            {
                return GetResourceText("PowerPointAddIn1.Ribbon.xml");
            }
    
            #endregion
    
            #region リボンのコールバック
            //ここでコールバック メソッドを作成します。コールバック メソッドの追加について詳しくは https://go.microsoft.com/fwlink/?LinkID=271226 をご覧ください
    
            public void Ribbon_Load(Office.IRibbonUI ribbonUI)
            {
                this.ribbon = ribbonUI;
            }
    
            /// <summary>トグルボタンの状態を返すコールバック</summary>
            /// <param name="control"></param>
            /// <returns>トグルボタンのチェック状態</returns>
            public bool tgl_getPressed(Office.IRibbonControl control)
            {
                switch (this.state)
                {
                case ToggleState.A:
                    return control.Id == "toggleButton_A";
                case ToggleState.B:
                    return control.Id == "toggleButton_B";
                default:
                    return false;
                }
            }
    
            /// <summary>トグルボタンをクリックしたときのコールバック</summary>
            /// <param name="control"></param>
            /// <param name="pressed">クリック後のチェック状態</param>
            public void tgl_onAction(Office.IRibbonControl control, bool pressed)
            {
                if (control.Id == "toggleButton_A")
                {
                    state = pressed ? ToggleState.A : ToggleState.B ;
                    this.ribbon.InvalidateControl("toggleButton_B");
                }
                if (control.Id == "toggleButton_B")
                {
                    state = pressed ? ToggleState.B : ToggleState.A;
                    this.ribbon.InvalidateControl("toggleButton_A");
                }
    
            }
    
            private enum ToggleState
            {
                A,
                B
            }
            private ToggleState state = ToggleState.A;
    
            #endregion
    
            #region ヘルパー
    
            private static string GetResourceText(string resourceName)
            {
                Assembly asm = Assembly.GetExecutingAssembly();
                string[] resourceNames = asm.GetManifestResourceNames();
                for (int i = 0; i < resourceNames.Length; ++i)
                {
                    if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                        {
                            if (resourceReader != null)
                            {
                                return resourceReader.ReadToEnd();
                            }
                        }
                    }
                }
                return null;
            }
    
            #endregion
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク takuro1995 2020年1月20日 17:35
    2020年1月20日 12:33
  • ご回答ありがとうございます。

    うまく実装することが出来ました。

    大変参考になりました。ありがとうございました。

    2020年1月20日 17:35