自定义按钮MyButton右键点击事件无响应,代码判断无效求助
问题描述
自定义按钮MyButton绑定了如下Click事件处理方法:
public void click(object? sender, MouseEventArgs e) { var btn = sender as MyButton; if (e.Button == MouseButtons.Right) { btn.ForeColor = Color.Green; btn.Text = "FLAG"; } else { // 左键相关功能正常,此处代码无问题 } }
左键点击按钮时,按钮可正常显示数字或"BOMB"文本,功能符合预期;但右键点击时,按钮无任何反应,无法显示绿色文本"FLAG"。已尝试用if (e.Button == MouseButtons.Right)判断右键操作,但问题仍未解决。
可能的原因及解决办法
WinForms Button默认不响应右键Click事件
标准WinForms Button控件的Click事件只会由左键点击触发,右键点击不会触发该事件,自定义按钮若继承自标准Button也会继承这个特性。
解决办法:- 改用
MouseUp或MouseDown事件处理右键操作:public void btn_MouseUp(object? sender, MouseEventArgs e) { var btn = sender as MyButton; if (e.Button == MouseButtons.Right) { btn.ForeColor = Color.Green; btn.Text = "FLAG"; } else if(e.Button == MouseButtons.Left) { // 原左键Click事件的代码移至此处 } } - 重写自定义按钮的
WndProc方法,让右键点击触发Click事件:protected override void WndProc(ref Message m) { const int WM_RBUTTONUP = 0x0205; if (m.Msg == WM_RBUTTONUP) { OnClick(EventArgs.Empty); } base.WndProc(ref m); }
- 改用
自定义按钮内部拦截了右键事件
检查MyButton类的代码,若重写了OnMouseDown、OnClick等方法,确认是否调用了base.xxx(e)。如果没有调用基类方法,会导致事件无法正常向上传递,右键操作的信号被拦截。按钮状态被其他代码覆盖
右键设置文本后,可能存在定时刷新、状态同步等代码,立刻将按钮Text改回原有内容。可以在btn.Text = "FLAG"处添加断点,调试查看后续是否有其他代码修改了按钮的Text或ForeColor属性。
内容的提问来源于stack exchange,提问作者GoTouchGrass
相关产品推荐
相关产品推荐

