首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visio : InvalidateControl不处理焦点更改

Visio : InvalidateControl不处理焦点更改
EN

Stack Overflow用户
提问于 2020-08-31 10:45:01
回答 1查看 138关注 0票数 0

使用Visio2013,我面临着InvalidateControl方法(或Visio机制)的奇怪行为。我的想法是,每当我在dropDown1中更改其项值时,就会更改它中的选定项。

当我更改文本并点击带状选项卡上的空闲区域时,它会工作,但如果我单击editBox2使其处于活动状态(焦点),则不起作用。在后一种情况下,只有在我随后单击DropDown本身时,DropDown才会得到更新(并调用回调)。

我还注意到,每当Visio窗口失去焦点并再次获得它时,DropDown就会得到更新(例如,如果我切换到另一个应用程序并返回),所以我的另一个讨厌的想法是强制Visio以某种方式更新其UI (例如通过WinAPI,如RedrawWindow等),不幸的是,我并不了解WinAPI的所有内容。

代码语言:javascript
复制
<?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>

丝带类

代码语言:javascript
复制
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 information 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

    }

示例项目 Visual 2013 / Visio 2013

EN

回答 1

Stack Overflow用户

发布于 2020-08-31 15:35:28

这可能是一个特定的Visio版本(2013年)的问题吗?对我来说,一切似乎都正常工作(当您将焦点从edit1更改为edit2时,组合框会发生变化)?这是最新的Visio (16.0.13127):

如果它不仅适用于2013年,我会尝试service :)也就是说,代码本身看起来不错,没有什么问题。

如果您真的-真的需要一个特定版本的"hacky“解决方案,我将尝试订阅VisioIsIdle事件,并在那里进行更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63669312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档