VSTO 功能区按钮打开 Windows 窗体但无法在不关闭窗体 C# 的情况下使用 Excel 的另一个实例
VSTO Ribbon Button Opens Windows Form But Unable to Use another Instance of Excel without closing the form C#
我有一个 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();
}
如果您在 VSTO 按钮事件处理程序中打开模态对话框,Excel 主线程将被阻止并且 Excel 不会响应用户输入消息。
这还包括尝试打开另一个工作簿。例如,此行为类似于打开 "Format Cells" 对话框。
解决方案:
1) 一种不需要编程的快速解决方法是在尝试打开新工作簿时单击 ALT 按钮。 Excel 将显示消息
要求您打开 Excel.
的新实例
2) 另一种方法是在 c# 中打开无模态对话框(使用 Show 函数而不是 ShowDialog)。这类似于 Find/Replace window of Excel.
请查看以下示例以了解更多详细信息以及如何从此类对话框中获取结果。
https://www.codeproject.com/Articles/27010/Modal-and-Modeless-Dialog-Box-in-C
我有一个 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();
}
如果您在 VSTO 按钮事件处理程序中打开模态对话框,Excel 主线程将被阻止并且 Excel 不会响应用户输入消息。
这还包括尝试打开另一个工作簿。例如,此行为类似于打开 "Format Cells" 对话框。
解决方案:
1) 一种不需要编程的快速解决方法是在尝试打开新工作簿时单击 ALT 按钮。 Excel 将显示消息 要求您打开 Excel.
的新实例2) 另一种方法是在 c# 中打开无模态对话框(使用 Show 函数而不是 ShowDialog)。这类似于 Find/Replace window of Excel.
请查看以下示例以了解更多详细信息以及如何从此类对话框中获取结果。 https://www.codeproject.com/Articles/27010/Modal-and-Modeless-Dialog-Box-in-C