MouseWheel event doesn't fire when using any control with scrolbars (in C# Windows Forms)

有些话、适合烂在心里 提交于 2019-12-19 05:15:04

问题


MouseWheel event doesn't fire when I' am using any control (ListBox, Panel, TextBox) with scrollbars.

To reproduce problem:

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();
  }
 }

回答1:


I was having the same problem, and what worked for me was to add a handler for the event MouseEnter in the control, that one is triggered with or without focus.

private void chart1_MouseEnter(object sender, EventArgs e)
{
    chart1.Focus();
}

After that I could get the mouseWheel events with no problems.




回答2:


You normally need to make sure the control you want to handle the MouseWheel event is active.

For example try calling button1.Select() in the Form Load (or Shown) event and then using the scroll wheel.

eg:

private void Form1_Load(object sender, EventArgs e)
{
    button1.MouseWheel += new MouseEventHandler(button1_MouseWheel);

    button1.Select();  
}



回答3:


I found solution, gility is default "Mouse Configuration". Lenovo USB Optical Wheel Mouse default configuration is:

Control Panel/Mouse/Wheel/Whell->Enable Universal Scrolling;

I changed to:

Control Panel/Mouse/Wheel/Whell->Use Microsoft Office 97 Scrolling Emulation Only

Now in .net code MouseWheel working with Focused Control.


But questions are:

  • how can I fix it in .net code?
  • how can I detect this situation in .net code?

Any ideas ?




回答4:


I tried your example, and, whether the lines were commented or not, the MouseWheel event only fires if the button is focused. This behavior is by design. (the MouseWheel event, like keyboard events, goes to the focused control)



来源:https://stackoverflow.com/questions/2094378/mousewheel-event-doesnt-fire-when-using-any-control-with-scrolbars-in-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!