问题描述
使用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):
如果它仅不适用于2013,我会尝试使用Service Pack :)代码本身看起来还不错,没有任何问题。
如果您确实确实需要针对该特定版本的“ hacky”解决方法,我将尝试订阅VisioIsIdle事件,并在那里进行更新。