【问题标题】:Continuous Scrolling with Panels in Panels使用面板中的面板连续滚动
【发布时间】:2018-08-08 13:54:42
【问题描述】:

我目前正在开发报告,这些报告绝对是海量的,需要采用某种格式。为此,我创建了一个表单,并将其多次插入到面板中。

我达到了面板的高度限制,所以我将信息分成更小的类别,将它们放在单独的面板上,然后将面板放入原始面板中

Original Panel{
     Panel1{
          info
          info
          info
     }
     Panel2{
          info
          info
          info
     }
     Panel3{
          info
          info
          info
     }
}

除了滚动之外,这非常有效。各个面板滚动到底部,然后停止。当子面板到达顶部或底部时,我希望主面板滚动。

用另一种方式解释,在 html 中的 DIV 中找到的功能。内部 DIV 滚动,当达到 MAX 或 MIN 高度时,父 DIV 继续滚动。

有没有办法做到这一点?

【问题讨论】:

  • 您的目标是什么:Winforms、WPF、ASP..?您应该始终正确标记您的问题,以便人们可以在问题页面上看到它!
  • 抱歉,已编辑标签以反映 Win-forms。无论如何,我可能已经找到了解决方案。如果它工作正常会发布它。

标签: c# winforms user-interface .net-4.0


【解决方案1】:

所以,经过一些实验,我找到了答案,并将其发布给任何需要它的人。

private void flowLayout_MouseWheel(object sender, MouseEventArgs e)
    {
        var currentPosition = this.flowLayoutPanel1.AutoScrollPosition.Y;

        if((currentPosition == this.flowLayoutPanel1.VerticalScroll.Minimum && e.Delta>0) || (currentPosition == -1*(this.flowLayoutPanel1.VerticalScroll.Maximum + 1 - this.flowLayoutPanel1.VerticalScroll.LargeChange) && e.Delta<0))
        {
            Control control = this.Parent;
            FlowLayoutPanel flp = control as FlowLayoutPanel;
            if(flp == null) { return; }

            flp.VerticalScroll.Value = Math.Min(Math.Max(flp.VerticalScroll.Value - e.Delta, 0), (flp.VerticalScroll.Maximum + 1 - flp.VerticalScroll.LargeChange));
        }

    }

此代码首先获取 FlowLayoutPanel 的当前位置。

var currentPosition = this.flowLayoutPanel1.AutoScrollPosition.Y;

如果 e.Delta 为负数,则用户正在向下滚动。向上是积极的。

if(
         (currentPosition == this.flowLayoutPanel1.VerticalScroll.Minimum 
         && e.Delta>0) 
         || (currentPosition == -1*(this.flowLayoutPanel1.VerticalScroll.Maximum + 1 - this.flowLayoutPanel1.VerticalScroll.LargeChange) 
         && e.Delta<0)
  )

如果 Panel 滚动到顶部,并且用户向上滚动,它会获取表单的 Parent,即主面板。如果无法获取面板,则退出。

Control control = this.Parent;
FlowLayoutPanel flp = control as FlowLayoutPanel;
if(flp == null) { return; }

然后它将主面板调整相同的增量,使用 Max 和 Min 对其进行约束以避免在尝试将值设置为小于最小值或大于最大值时导致的 OutOfBoundsException。

flp.VerticalScroll.Value = Math.Min(
                               Math.Max(flp.VerticalScroll.Value - e.Delta, 0), 
                               (flp.VerticalScroll.Maximum + 1 - flp.VerticalScroll.LargeChange)
                           );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2015-03-14
    • 2010-11-29
    • 1970-01-01
    • 2011-03-28
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多