【问题标题】:MouseWheel event doesn't fire when using any control with scrolbars (in C# Windows Forms)使用带有滚动条的任何控件时不会触发 MouseWheel 事件(在 C# Windows 窗体中)
【发布时间】: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 是否有机会找到解决方案?

标签: c# winforms events scrollbar mousewheel


【解决方案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(原文如此!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2011-11-25
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
相关资源
最近更新 更多