【问题标题】:Is there any way to set a Winforms panel to scroll horizontal rather than vertical to mouse wheel?有没有办法将 Winforms 面板设置为水平滚动而不是垂直滚动到鼠标滚轮?
【发布时间】:2016-02-03 01:40:12
【问题描述】:

我有一个 FlowLayoutPanel 布局它包含的控件自上而下然后从左到右,这样通常它不会有垂直滚动条,只有水平滚动条。因此,当您使用鼠标滚轮时,它会水平滚动。太好了。

直到用户长出一个比屏幕高的控件...然后它必须有一个垂直滚动条。美好的。但是一旦出现垂直滚动条,鼠标滚轮输入就会开始垂直滚动。不好。

那么,有什么方法可以告诉 FlowLayoutPanel 或滚动条鼠标滚轮应该总是水平的? 还是告诉它先到水平条,然后只有在没有水平时才垂直?

【问题讨论】:

    标签: .net winforms scroll mousewheel flowlayoutpanel


    【解决方案1】:

    子类FlowLayoutPanel 并覆盖OnMouseWheel 方法。不要调用base 方法。复制并粘贴此方法的下半部分代码:

    http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ScrollableControl.cs,c3f702621158871b

    【讨论】:

    • 感谢您的建议。查看您指向我的代码,我看到了对 base.OnMouseWheel(e) 调用的注释,这似乎暗示最后调用它很重要......所以,不调用它听起来很可怕。另外,我讨厌将基本代码复制到派生类中。但是,根据这个建议,我在下面发布了一个替代答案。谢谢!!!
    【解决方案2】:

    感谢 Loathing 的出色建议,我也将其标记为答案,我选择简单地检测两个滚动条都打开的情况,在这种情况下,在我调用基类的方法时暂时关闭 VScroll。

    为什么?因为我担心鉴于您指出的对代码的注释不调用基类的方法的后果......这显然很重要。

    我没有看到此解决方案有任何闪烁或其他不良后果,但如果有我应该考虑的缺点,请告诉我。

        protected override void OnMouseWheel(MouseEventArgs e)
        {
            if (this.PreferHorizontalScroll && this.VScroll && this.HScroll)
            {
                this.VScroll = false;
                base.OnMouseWheel(e);
                this.VScroll = true;
            }
            else
            {
                base.OnMouseWheel(e);
            }
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多