[英]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的自定义控件 。 我真的不明白Visible
和TabIndex
属性的原因以及原因,它们是完全不相关的! 另外,我删除了其中一个评估人(这引起了问题),因为另一个评估人很好,但是一旦删除,以前确定的评估人就开始引起此问题。
有谁知道为什么会这样以及如何解决呢?
非常感谢您,如果我写得不够准确,请对不起。 这是我在本网站上的第一个问题。
可能是当您使其不可见时,您正在将焦点推到其他控件上(因为该控件失去了焦点,并且当控件消失时焦点又移到了其他位置)。 获得焦点的特定控件也将取决于制表符索引值,因为它类似于下一个或上一个控件。
请注意,使用自定义控件时,鼠标单击不会自动获得焦点。 因此,例如,您将需要在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.