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

时间:2016-05-03 15:42:26

标签: c# winforms mousewheel visible tabindex

我的鼠标滚轮事件非常严重。我试图找到任何类型的参考,但总能在这个问题上找到不同主题的答案。我已经为整个表单制作了一个鼠标滚轮事件(它也是全屏的,但无论鼠标在哪里都可以使用) - MouseWheel+=ChangeLength;(或MouseWheel += new MouseEventHandler(ChangeLength);,它并不重要并在它的第一行放置断点,只是为了看它是否有效。

它没有。

我打开了一个空白项目来测试它,令人惊讶的是,它做到了!然后,我找到了问题的根源,发现设计师中只有两行在成功触发事件和完全不触发之间产生差异。这两行是 -

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

如果这些行中的任何一行被取消注释,滚动鼠标滚轮时没有任何反应,但如果两者都被删除或注释,它就可以正常工作。使用Focus(),点击屏幕,更改设计师以外的属性以及其他已知方法并没有帮助。

我需要添加rater 而不是只是一个常规控件,这可能是这个奇怪问题的根源。它是一个名为ShapeRater的自定义控件。我真的不明白VisibleTabIndex属性导致它的原因和方式,它们完全不相关!此外,我删除了其中一个评估者(导致问题),因为另一个评价很好,但一旦删除,之前的OK版本就会开始导致这个问题。

有没有人知道为什么会发生这种情况以及如何解决这个问题?

如果我没有足够准确的写作,请先谢谢。这是我在这个网站上的第一个问题。

2 个答案:

答案 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)

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