【问题标题】:C# winforms- MouseWheel event not firing because of control propertiesC# winforms - 由于控件属性,MouseWheel 事件未触发
【发布时间】:2016-05-03 15:42:25
【问题描述】:

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

没有。

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

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

如果这些行中的任何一个未注释,滚动鼠标滚轮时不会发生任何事情,但如果两者都被删除或注释,它工作得很好。使用Focus()、点击屏幕、更改设计器之外的属性和其他已知方法均无济于事。

我需要补充一点,rater 只是一个常规控件,这可能是这个奇怪问题的根源。它是一个名为ShapeRater 的自定义控件。我真的不明白VisibleTabIndex 属性为什么以及如何导致它,它们完全不相关!另外,我删除了其中一位评分者(导致问题),因为另一位很好,但一旦删除,之前正常的一位开始导致此问题。

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


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

【问题讨论】:

    标签: c# winforms mousewheel visible tabindex


    【解决方案1】:

    可能当您使其不可见时,您正在将焦点推到其他控件(因为您的控件失去焦点并且当控件消失时焦点转到其他地方)。获得焦点的特定控件也将取决于选项卡索引值,因为它类似于下一个或上一个控件。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        相关资源
        最近更新 更多