我的鼠标滚轮事件非常严重。我试图找到任何类型的参考,但总能在这个问题上找到不同主题的答案。我已经为整个表单制作了一个鼠标滚轮事件(它也是全屏的,但无论鼠标在哪里都可以使用) - MouseWheel+=ChangeLength;
(或MouseWheel += new MouseEventHandler(ChangeLength);
,它并不重要并在它的第一行放置断点,只是为了看它是否有效。
它没有。
我打开了一个空白项目来测试它,令人惊讶的是,它做到了!然后,我找到了问题的根源,发现设计师中只有两行在成功触发事件和完全不触发之间产生差异。这两行是 -
this.rater.TabIndex = 15;
this.rater.Visible = false;
如果这些行中的任何一行被取消注释,滚动鼠标滚轮时没有任何反应,但如果两者都被删除或注释,它就可以正常工作。使用Focus()
,点击屏幕,更改设计师以外的属性以及其他已知方法并没有帮助。
我需要添加rater
而不是只是一个常规控件,这可能是这个奇怪问题的根源。它是一个名为ShapeRater的自定义控件。我真的不明白Visible
和TabIndex
属性导致它的原因和方式,它们完全不相关!此外,我删除了其中一个评估者(导致问题),因为另一个评价很好,但一旦删除,之前的OK版本就会开始导致这个问题。
有没有人知道为什么会发生这种情况以及如何解决这个问题?
如果我没有足够准确的写作,请先谢谢。这是我在这个网站上的第一个问题。
答案 0 :(得分:0)
当你让它不可见时,你可能会将焦点推向其他控制(因为你的控制失去焦点,当控制消失时,焦点转移到其他地方)。获得焦点的特定控件也将取决于选项卡索引值,因为它将类似于它所属的下一个或上一个控件。
请注意,使用自定义控件时,鼠标点击不会自动获得焦点。因此,您需要在Focus()
事件中进行MouseDown
来电,例如。
除此之外,为了通过将鼠标移动到鼠标滚轮事件上来控制鼠标滚轮事件,您必须将注意力集中在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
}
答案 1 :(得分:0)
我知道这是很晚,但我再次登录并发现我忘了关闭我的问题了。 如果我没记错的话,问题与在应用程序中使用箭头后失去焦点有关,所以我最终更换了键。