由于控件属性,WinForms中的MouseWheel事件未触发

hwamh0ep  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(139)

我对鼠标滚轮事件有很大的问题。我试着找到任何关于它的参考文献,但总是找到关于这个问题的不同主题的答案。
我已经为整个窗体(也是全屏,但不管鼠标在哪里,它都应该工作):MouseWheel+=ChangeLength;(或者MouseWheel += new MouseEventHandler(ChangeLength);,没关系)创建了一个鼠标滚轮事件,并在它的第一行放置了一个断点,看看它是否工作。
但没有。
我打开了一个空白项目来测试它,令人惊讶的是,它确实做到了!然后我查找问题的根源,发现设计器中只有两行代码可以区分成功触发事件和根本不触发事件。

this.rater.TabIndex = 15;
 this.rater.Visible = false;

字符串
如果这些行中有任何一行没有注解,那么滚动鼠标滚轮时不会有任何React,但是如果两行都被删除或注解了,那么它就正常工作了。使用Focus()、在屏幕上单击、在设计器外部更改属性以及其他已知方法都无济于事。
我需要补充的是,rater * 不 * 只是一个常规控件,这可能是这个奇怪问题的根源。它是一个名为ShapeRater的自定义控件。我真的不明白为什么和如何导致VisibleTabIndex的属性,他们是完全无关的!此外,我删除了其中一个评分员(这导致了问题),因为另一个是好的,但一旦删除,以前确定的一个开始导致这一点代替。
有人知道为什么会发生这种情况吗?以及如何解决?

nuypyhwy

nuypyhwy1#

当你使它不可见时,你可能会将焦点推到其他控件上(因为当控件消失时,控件会失去焦点,焦点会转移到其他地方)。获得焦点的特定控件也取决于选项卡索引值,因为它将类似于它福尔斯落在的下一个或上一个控件。
请注意,对于自定义控件,焦点不会通过鼠标单击自动获得。因此,例如,您需要在MouseDown事件中调用Focus()
除此之外,为了使一个控件通过移动鼠标来获得鼠标滚轮事件,你必须在MouseEnter中获得焦点。比如MouseEnter += (s, e) => Focus();。我不确定这是一个完美的解决方案,虽然,因为我认为你会通过移动鼠标来从其他控件中“窃取”焦点。
你可以做的另一件事,我认为是更好的是只是处理表单上每个控件的MouseWheel事件,然后在响应它之前检查鼠标是否真的在你的区域内。
例如:

HandleCreated += (s, e) => {
   var maybeForm = FindForm();
   if (maybeForm == null)
      return; // or throw since you should have a form by now
   var form = maybeForm;

   MouseEventHandler mouseScrollDelegate = (s, e) => MouseScroll(e.Delta);
   foreach (var control in form.Controls.Cast<Control>())
      control.MouseWheel += mouseScrollDelegate;
};

...

void MouseScroll(int pDelta) {
   var screenMouse = Cursor.Position;
   var clientMouse = PointToClient(screenMouse);
   if (!ClientRectangle.Contains(clientMouse))
      return;

   // do something
}

字符串

ndh0cuux

ndh0cuux2#

如果我没记错的话,这个问题与在应用程序中使用箭头后失去焦点有关,所以我最终更换了键。

相关问题