使用带有滚动条的任何控件时不会触发 MouseWheel 事件(在 C# Windows 窗体中)
Posted
技术标签:
【中文标题】使用带有滚动条的任何控件时不会触发 MouseWheel 事件(在 C# Windows 窗体中)【英文标题】:MouseWheel event doesn't fire when using any control with scrolbars (in C# Windows Forms) 【发布时间】:2011-01-06 20:28:56 【问题描述】:MouseWheel 事件不会触发 当我使用带有滚动条的任何控件(ListBox、Panel、TextBox)时。
重现问题:
public class Form1 : Form
private readonly Button button1;
private readonly TextBox textBox1;
private void button1_MouseWheel(object sender, MouseEventArgs e)
ToString(); // doesn't fire when uncomment lines below
public Form1()
button1 = new Button();
textBox1 = new TextBox();
SuspendLayout();
button1.Location = new System.Drawing.Point(80, 105);
button1.Size = new System.Drawing.Size(75, 23);
button1.MouseWheel += button1_MouseWheel;
button1.Click += button1_Click;
textBox1.Location = new System.Drawing.Point(338, 105);
//textBox1.Multiline = true; // uncomment this
//textBox1.ScrollBars = ScrollBars.Vertical; // uncomment this
textBox1.Size = new System.Drawing.Size(100, 92);
ClientSize = new System.Drawing.Size(604, 257);
Controls.Add(textBox1);
Controls.Add(button1);
ResumeLayout(false);
PerformLayout();
// Clicking the button sets Focus, but even I do it explicit Focus() or Select()
// still doesn't work
private void button1_Click(object sender, System.EventArgs e)
button1.Focus();
button1.Select();
【问题讨论】:
可能问题出在鼠标上,我用的是“Lenovo USB Optical Wheel Mouse”(默认配置“Whell Button”功能“Quick/AutoScroll”) 我使用:Windows Vista Buisness、.Net Framework 3.5 SP1、Visual Studio 2008 Standard Edition(所有官方修补程序)。构建调试:目标框架 = .Net Framework 3.5,输出类型 = Windows 应用程序 鼠标配置:控制面板/鼠标/滚轮/Well->启用通用滚动;控制面板/鼠标/滚轮/滚轮按钮->快速/自动滚动;控制面板/鼠标/滚轮/滚动速度->滚动=每秒 10 行; 我正在努力解决同样的问题。我认为许多人将其与“专注与悬停”问题混淆了。我有相同的基于 ScrollableControl 的控件,它要么触发 OnMouseWheel,要么不触发,具体取决于它当前是否显示滚动条。我认为滚动条以某种方式捕获了滚轮事件,但我还没有充分研究这个问题。 OP 是否有机会找到解决方案? 【参考方案1】:我遇到了同样的问题,对我有用的是在控件中为事件 MouseEnter 添加一个处理程序,该处理程序在有或没有焦点的情况下触发。
private void chart1_MouseEnter(object sender, EventArgs e)
chart1.Focus();
之后我可以毫无问题地获得 mouseWheel 事件。
【讨论】:
奇怪的是,在一个 W10 计算机上,相同的程序执行了鼠标滚轮,而在另一个程序上却没有,直到我使用了您的解决方案。【参考方案2】:您通常需要确保要处理 MouseWheel 事件的控件处于活动状态。
例如尝试在表单加载(或显示)事件中调用button1.Select()
,然后使用滚轮。
例如:
private void Form1_Load(object sender, EventArgs e)
button1.MouseWheel += new MouseEventHandler(button1_MouseWheel);
button1.Select();
【讨论】:
仍然没有,同样的问题,这很奇怪,但在我的情况下它不起作用。即使我设置了焦点或选择,并且光标在按钮 1 上,当我使用鼠标滚轮时,它也会滚动 textbox1(原文如此!)【参考方案3】:我找到了解决方案,gility 是默认的“鼠标配置”。 Lenovo USB 光学滚轮鼠标默认配置为:
控制面板/鼠标/滚轮/Well->启用通用滚动;
我改成:
控制面板/鼠标/滚轮/Well->仅使用 Microsoft Office 97 滚动仿真
现在在 .net 代码中 MouseWheel 与 Focused Control 一起工作。
但问题是:
如何在 .net 代码中修复它? 如何在 .net 代码中检测到这种情况?有什么想法吗?
【讨论】:
使用 Spy++ 并检查哪些消息正在发送到控件。【参考方案4】:我尝试了您的示例,并且无论这些行是否被注释,MouseWheel 事件仅在按钮获得焦点时才会触发。此行为是设计使然。 (MouseWheel
事件和键盘事件一样,转到焦点控件)
【讨论】:
我阅读了有关 i 文档的信息,但这很奇怪,但在我的情况下它不起作用:我添加到代码:public Form1() (...) button1.Click +=按钮1_点击; (...) private void button1_Click(object sender, System.EventArgs e) button1.Focus();不工作,即使我设置了焦点,并且光标在按钮 1 上,当我使用鼠标滚轮时,它会滚动 textbox1(原文如此!)以上是关于使用带有滚动条的任何控件时不会触发 MouseWheel 事件(在 C# Windows 窗体中)的主要内容,如果未能解决你的问题,请参考以下文章
IOS Toolbarbutton项目不触发带有滚动条的动作