ExcelDNA C#图表.MouseDown事件只触发一次



每次在打开的工作簿的每个工作表上单击图表时,我都会尝试处理该事件。我使用的SheetActivate事件如下:

private static void Xlapp_SheetActivate(Object obj_Ws)
{
myCharts.SetAllCharts((XL.Worksheet)obj_Ws);
}

每次激活工作表时调用一个方法;SetAllCharts"方法在";MyCharts"类看起来像:

internal void SetAllCharts(object obj_Ws)
{
XL.Worksheet Ws = (XL.Worksheet)obj_Ws;
XL.ChartObjects ChObj = Ws.ChartObjects();
if (ChObj.Count > 0)
{
xlapp.StatusBar = ("Setting " + ChObj.Count + " charts");
foreach (XL.ChartObject obj_Chart in ChObj)
{
XL.Chart myChart = obj_Chart.Chart;
myChart.MouseDown += myChart_MouseDown;
}
}
}

目前,方法处理程序(只是一条xlapp.StatusBar消息,报告单击的X和Y(可以工作。。。只有一次,第一次激活工作表时,第一次单击图表时。在那之后,我再也没有收到消息框了。。。我做错了什么??

您必须小心设置事件处理程序的COM对象(或者至少是它们周围的神奇.NET包装器(的生存期。它们可能是在您枚举集合时动态创建的,并且很快就会收集垃圾,从而在过程中丢失事件处理程序。这就是为什么它能工作一次或几次。

在您开始考虑如何编写代码之前,对此的测试是将对象保留在某个更高的对象级别或全局列表中。在您的代码中,这将是您正在枚举的obj_Chart对象。只要确保这些物体都是活的。

(我觉得这些东西有点令人困惑,因为WPF正好相反——我认为事件处理程序阻止了垃圾收集?(

最新更新