C#如何用同一方法处理Paint、MouseMove不同类事件并修复CS0123报错
CS0123报错原因
- 事件绑定要求处理方法的签名必须和对应委托完全匹配:
PaintEventHandler要求方法签名为void 方法名(object sender, PaintEventArgs e),MouseEventHandler要求签名为void 方法名(object sender, MouseEventArgs e),你定义的My_func同时接收两个事件参数,和两个委托的签名都不匹配,所以编译报错。 - 额外代码问题:你在
Form1_Load中把pictureBox1定义为局部变量,外部方法无法访问;Pen声明末尾缺分号;My_func中使用的e变量未定义。
修复实现方案
该需求完全可以实现,核心思路是:用类字段存储当前鼠标位置,鼠标移动时更新位置并触发控件重绘,重绘事件中读取存储的位置绘制圆形。
修正后的完整代码如下:
using System.Drawing; using System.Windows.Forms; public partial class Form1 : Form { // 类级别字段,跨方法访问 private readonly Pen _pen = new Pen(Color.Black, 3); private Point _currentMousePos = Point.Empty; private PictureBox _pictureBox1; private void Form1_Load(object sender, EventArgs e) { _pictureBox1 = new PictureBox(); _pictureBox1.Dock = DockStyle.Fill; // 绑定对应签名的事件处理方法 _pictureBox1.Paint += PictureBox1_Paint; _pictureBox1.MouseMove += PictureBox1_MouseMove; this.Controls.Add(_pictureBox1); } // 鼠标移动事件处理,签名匹配MouseEventHandler private void PictureBox1_MouseMove(object sender, MouseEventArgs e) { // 更新当前鼠标位置 _currentMousePos = e.Location; // 触发pictureBox重绘 _pictureBox1.Invalidate(); } // 重绘事件处理,签名匹配PaintEventHandler private void PictureBox1_Paint(object sender, PaintEventArgs e) { // 在当前鼠标位置绘制圆形 e.Graphics.DrawEllipse(_pen, _currentMousePos.X, _currentMousePos.Y, 3, 3); } // 释放GDI资源,避免内存泄漏 protected override void Dispose(bool disposing) { if (disposing) { _pen?.Dispose(); } base.Dispose(disposing); } }
如果非要强行用同一个方法处理两个事件,也可以把方法签名改为private void My_func(object sender, EventArgs e),在方法内判断e的类型做分支处理,但这种写法可读性差,不推荐使用。
内容的提问来源于stack exchange,提问作者Mihail Petrovich
相关产品推荐
相关产品推荐

