如何为ugTopActivity_ChartDataClicked添加FillSceneGraphEventArgs参数并解决报错?
解决"No overload for matches delegate"与空引用错误
首先得明确两个核心问题:
- 你直接修改事件处理程序的参数列表导致委托不匹配,是因为每个事件的委托签名是固定的——
ChartDataClicked事件的委托只接受object sender和ChartDataEventArgs e这两个参数,框架触发事件时只会传递这两个值,所以你加第三个参数FillSceneGraphEventArgs ex肯定会报错。 - 你尝试把
sender转成FillSceneGraphEventArgs是完全错误的:sender是触发事件的控件实例(也就是你的ugTopActivity图表控件),根本不是FillSceneGraphEventArgs类型,所以必然会得到null,触发空引用异常。
正确的解决方案:结合两个事件实现需求
你的目标是在图表点击时往场景图里添加Box,但FillSceneGraphEventArgs是FillSceneGraph事件的专属参数(这个事件负责场景图的绘制),所以我们需要把两个事件配合起来用:
1. 定义类级变量存储要添加的元素
在窗体/控件类里声明一个变量,用来临时保存点击时创建的Box:
private Box _boxToAdd;
2. 修改ChartDataClicked事件处理程序
在这里创建Box,但不要直接添加到场景图,而是把它赋值给类变量,然后触发图表重绘(这样会触发FillSceneGraph事件):
private void ugTopActivity_ChartDataClicked(object sender, ChartDataEventArgs e) { // 先获取图表控件实例 var chart = sender as YourActualChartType; // 替换成你的图表控件真实类型,比如UltraChart if (chart == null) return; // 从图表本身获取X、Y轴(这才是正确的获取方式) IAdvanceAxis x = (IAdvanceAxis)chart.Grid["X"]; IAdvanceAxis y = (IAdvanceAxis)chart.Grid["Y"]; // 创建Box并设置样式 _boxToAdd = new Box(new Infragistics.Win.DataVisualization.Rectangle((double)x.Map(0), (double)y.Map(1), 50, 371)); _boxToAdd.PE.Fill = Color.Black; _boxToAdd.PE.FillOpacity = 70; // 触发图表重绘,让FillSceneGraph事件执行 chart.Refresh(); }
3. 添加FillSceneGraph事件处理程序
给图表的FillSceneGraph事件绑定处理方法,在这里把临时保存的Box添加到场景图:
private void ugTopActivity_FillSceneGraph(object sender, FillSceneGraphEventArgs ex) { if (_boxToAdd != null) { ex.SceneGraph.Add(_boxToAdd); // 如果只需要添加一次,清空变量避免重复添加 _boxToAdd = null; } }
4. 绑定FillSceneGraph事件
确保在窗体初始化(比如Form_Load方法)里把事件和处理程序绑定:
private void Form_Load(object sender, EventArgs e) { ugTopActivity.FillSceneGraph += ugTopActivity_FillSceneGraph; }
为什么要这么做?
ChartDataClicked是用户交互事件,只负责响应点击动作,它的参数里没有场景图相关的对象;FillSceneGraph是图表绘制时的事件,框架会自动传递FillSceneGraphEventArgs,里面包含了可操作的SceneGraph对象;- 通过类变量把点击时创建的
Box传递到绘制事件里,就能顺利完成添加操作。
内容的提问来源于stack exchange,提问作者john true
相关产品推荐
相关产品推荐

