我有一个相当小的任务,即在C#中使用VSTO创建Excel加载项(这是一项要求),只要在任何工作簿/工作表中选择了图表,我就必须在TaskPane中提供一些信息。
由于我对VSTO或Office扩展一般都是新手,我似乎没有找到任何专门的事件或其他可能性来识别用户在Excel中选择嵌入式图表的那一刻。
到目前为止,我环顾四周尝试了两件事,但两件似乎都没有按照我的意图行事:
Application.SheetSelectionChange
事件以拦截图表的选择。我很快发现,当选择图表时,此事件不会触发。文档说明ChartSheets不会发生这种情况,所以我想嵌入式图表也是如此。在查看Interop API一段时间后没有成功(由于我对VSTO缺乏经验,我可能没有找到合适的位置),我尝试了一个非常粗略的解决方案,看看是否有什么对我有用。
我创建了一个形成Application.ActiveChart
属性的线程,并且一旦它不为null,我就会检索我需要的信息并将其显示在我的任务窗格中 - 否则我将其隐藏起来。
当然,这个解决方案是我真正不想使用的解决方案,尤其是在COM下的多线程非常快速无法解决的情况下。
我怎样才能实现一个解决方案,一旦发生,就会识别用户在Excel中选择的图表?有关VSTO的任何指示或其他说明我可能需要知道吗?
似乎没有为此目的的专门活动。我使用了CommandBar.OnUpdate
事件(.NET Reference),除了其他事项,当选择图表时,它也会被解雇:
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Excel.Application excelApp = Globals.ThisAddIn.Application;
excelApp.CommandBars.OnUpdate += new Office._CommandBarsEvents_OnUpdateEventHandler(CommandBars_OnUpdate);
//Other code to be executed at startup
}
private void CommandBars_OnUpdate()
{
Excel.Application excelApp = Globals.ThisAddIn.Application;
Excel.Chart activeChart = null;
try
{
activeChart = excelApp.ActiveChart;
if (activeChart != null)
{
//Code to be triggered
}
}
catch
{
}
}
我受到这两个来源的启发,这种方法用于检测形状的选择:
https://code.msdn.microsoft.com/office/CSExcelNewEventForShapes-0e26b1f2
但是,此事件被激活了很多,所以要小心事件触发的代码。
希望有所帮助!问候