Visio VSTO:InvalidateControl无法处理焦点更改

问题描述

使用Visio 2013,我遇到了InvalidateControl方法(或Visio VSTO机制)的奇怪行为。我的想法是每当我更改dropDown1中的项目值时,都更改editBox1中的选定项目。

当我更改文本并按Enter或单击功能区选项卡上的空白区域时,它会起作用,但如果我单击editBox2使其处于活动状态(集中),则不会起作用。在后一种情况下,仅当我随后单击DropDown本身时,DropDown才会更新(并调用回调)。

我还注意到,每当Visio窗口失去焦点时,DropDown都会更新,而Ang又会再次获得它(例如,如果我切换到另一个应用并返回),所以我的另一个有创意的想法是强制Visio以某种方式更新其UI。 (例如通过RedrawWindow之类的WinAPI等),不幸的是,我对WinAPI的所有知识都不了解。

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns">
        <group id="group3" label="Test">
          <Box id="Box1">
            <editBox id="editBox1"
                     getText="GetText"
                     onChange="EditBoxTextChange"
                     sizeString="WWW" />
            <editBox id="editBox2"
                     getText="GetText"
                     sizeString="WWW" />
            <dropDown id="dropDown1"
                      getSelectedItemIndex="GetSelectedItemIndex"
                      getItemCount="GetItemCount"
                      getItemLabel="GetItemLabel"
                      sizeString="WWW" />
          </Box>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

丝带类

public class Ribbon1 : Office.IRibbonExtensibility
    {
        private Office.IRibbonUI ribbon;

        string[] data = { "1","2","3","4","5" };
        int selectedindex;

        public Ribbon1()
        {
        }

        #region IRibbonExtensibility Members

        public string GetCustomUI(string ribbonID)
        {
            return GetResourceText("FosusTest.Ribbon1.xml");
        }

        #endregion

        #region Ribbon Callbacks
        //Create callback methods here. For more @R_539_4045@ion about adding callback methods,visit http://go.microsoft.com/fwlink/?LinkID=271226

        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
        }

        public string GetText(IRibbonControl control)
        {
            if (control.Id == "editBox1")
            {
                return "1";
            }
            else
            {
                return "2";
            }
        }

        public void EditBoxTextChange(IRibbonControl control,string text)
        {
            for (var i = 0; i < data.Count(); ++i)
            {
                if (data[i] == text)
                {
                    selectedindex = i;
                    ribbon.InvalidateControl("dropDown1");
                    break;
                }
            }
        }

        public int GetSelectedItemIndex(IRibbonControl control)
        {
            return selectedindex;
        }

        public int GetItemCount(IRibbonControl control)
        {
            return data.Count();
        }

        public string GetItemLabel(IRibbonControl control,int index)
        {
            return data[index];
        }

        #endregion

    }

Example project Visual Studio 2013 / Visio 2013

解决方法

特定的Visio版本(2013)可能有问题吗?对我来说,一切似乎都正常运行(将焦点从edit1更改为edit2时,组合框也会更改)?这是最新的Visio(16.0.13127):

enter image description here

如果它仅不适用于2013,我会尝试使用Service Pack :)代码本身看起来还不错,没有任何问题。

如果您确实确实需要针对该特定版本的“ hacky”解决方法,我将尝试订阅VisioIsIdle事件,并在那里进行更新。