我有一个相当小的任务,即在C#中创建一个带有VSTO的Excel加载项(这是一项要求),只要在任何工作簿/工作表中选择了图表,我就必须在TaskPane中提供一些信息。
由于我对VSTO或Office扩展一般都是新手,我似乎没有找到任何专门的事件或其他可能性来识别用户在Excel中选择嵌入式图表的那一刻。
到目前为止,我环顾四周尝试了两件事,但两件似乎都没有按照我的意图行事:
Application.SheetSelectionChange
事件以拦截图表的选择。我很快发现,当选择图表时,此事件不会触发。文档说明ChartSheets不会发生这种情况,所以我想嵌入式图表也是如此。环顾Interop API一段时间没有成功(由于我对VSTO缺乏经验,我可能没有找到合适的地方),我尝试了一个非常粗略的解决方案,看看是否有什么对我有用。 / p>
我创建了一个轮询Application.ActiveChart
属性的线程,一旦它不为null,我就会检索我需要的信息并将其显示在我的TaskPane中 - 否则我将其隐藏。
当然,这个解决方案是我真正不想使用的解决方案,尤其是在COM下的多线程非常快速无法解决的情况下。
我怎样才能实现一个解决方案,一旦发生,就会识别用户在Excel中选择的图表?有关VSTO的任何指示或其他说明我可能需要知道吗?
答案 0 :(得分:0)
似乎没有为此目的专门的活动。我使用了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
但是,此事件触发的次数很多,因此请小心该事件触发的代码。
希望有帮助! 问候