繁体   English   中英

C#Winforms-由于控件属性而未触发MouseWheel事件

[英]C# winforms- MouseWheel event not firing because of control properties

我对鼠标滚轮事件有很大的疑问。 我试图找到任何形式的参考,但总能找到有关此问题的答案。 我为整个表单创建了一个鼠标滚轮事件(它也是全屏的,但是无论鼠标在哪里,它都应该起作用) MouseWheel+=ChangeLength; (或MouseWheel += new MouseEventHandler(ChangeLength);没关系),并在其第一行上放置一个断点,以查看其是否有效。

没有。

我打开了一个空白项目进行测试,令人惊讶的是,它做到了! 然后,我寻找问题的根源,发现设计器中只有两行可以区分成功触发事件和根本不触发事件。 这两行是-

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

如果这些行中的任何一条都未注释,则在滚动鼠标滚轮时什么也没有发生,但是如果删除或注释了这两项,就可以正常工作。 使用Focus() ,单击屏幕,在设计器外部更改属性和其他已知方法无济于事。

我需要补充的是rater 只是一个普通的控制,而这可能是这个奇怪的问题根源。 这是一个名为ShapeRater的自定义控件 我真的不明白VisibleTabIndex属性的原因以及原因,它们是完全不相关的! 另外,我删除了其中一个评估人(这引起了问题),因为另一个评估人很好,但是一旦删除,以前确定的评估人就开始引起此问题。

有谁知道为什么会这样以及如何解决呢?


非常感谢您,如果我写得不够准确,请对不起。 这是我在本网站上的第一个问题。

可能是当您使其不可见时,您正在将焦点推到其他控件上(因为该控件失去了焦点,并且当控件消失时焦点又移到了其他位置)。 获得焦点的特定控件也将取决于制表符索引值,因为它类似于下一个或上一个控件。

请注意,使用自定义控件时,鼠标单击不会自动获得焦点。 因此,例如,您将需要在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
}

我知道这已经很晚了 ,但是我再次登录,发现我忘记关闭我的问题。 如果我没记错的话,问题与在应用程序中使用箭头后失去焦点有关,因此我最终为此更换了键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM