使用带有滚动条的任何控件时不会触发 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项目不触发带有滚动条的动作

两个卷轴同时触发

为啥带有文本溢出和滚动条的 flex 子项不会在 Firefox 中展开?

my97日期控件弹出位置显示异常

滚动条的自动滑动

带有自定义滚动条的 QML Listview