【发布时间】:2020-01-12 19:53:02
【问题描述】:
我有一个 VSTO 应用程序,它在功能区上有多个组和按钮。当用户单击按钮时,Excel 上会加载一个特定的表单。看起来当表单打开时,除非表单在第一个实例中关闭,否则用户无法打开另一个 Excel 实例。有没有办法将加载项与不同的实例分开?
我开发的代码使用 getVisbility 回调来决定是否根据特定工作簿在功能区中显示选项卡。但是,这不允许用户在打开 Windows 窗体时使用多个 Excel 实例。一旦我关闭表单 - 一个新的 excel 实例已打开。 VSTO Excel 工具已在应用程序级别开发。
MainRibbon.xml
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
<ribbon>
<tabs>
<tab idMso="TabAddIns" label="MDS" insertBeforeMso="TabHome" getVisible="setVisbility" >
<group id="CreateLoadModel"
label="Create/Load Model">
<button id="createmodelbutton" label="Create New Model"
screentip="Text" onAction="OnCreateModel"
supertip="Create a new Model"
imageMso="GroupSmartArtCreateGraphic"/>
<button id="loadmodelbutton" label="Load Existing Model"
screentip="Text" onAction="OnLoadModel"
supertip="Load an Exisitng Model"
imageMso="FileOpen"/>
</group>
MainRibbon.cs
public bool setVisbility(Office.IRibbonControl control)
{
int nWorkbooks = Globals.ThisAddIn.Application.Workbooks.Count;
if (nWorkbooks == 0)
{
return false;
}
if (Globals.ThisAddIn.Application.ActiveWorkbook != null && Globals.ThisAddIn.Application.ActiveWorkbook.Name == "MDS.xlsm")
{
return true;
}
else
{
return false;
}
}
AddIn.cs
private void ThisAddIn_Startup(object sender, EventArgs e)
{
this.Application.WorkbookActivate += Application_WorkbookActivate;
this.Application.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);
}
private void Application_WorkbookActivate(Workbook Wb)
{
MainRibbon.ribbon.Invalidate();
}
【问题讨论】:
-
这些真的是其他实例,还是这些工作簿窗口在同一个实例中打开?我怀疑是后者。 Excel(和其他 Office 应用程序)在同一个应用程序实例中运行多个窗口。在任务管理器中查看列出了多少个 excel.exe 实例。或者在 Excel 的 Windows 菜单中的 View 选项卡下。
-
抱歉,这些是在同一实例中打开的工作簿窗口!用户是否还有办法打开 Excel 工作簿而不受另一个工作簿中的 Windows 窗体的影响?如果用户打开了表单,但目前想要同时检查另一个工作簿,用户不能在不关闭表单的情况下执行此操作吗?
-
您能否提供一个代码 sn-p,说明您如何向用户显示表单?