通过控制(非平滑)滚动面板实现控制

时间:2015-05-26 06:48:06

标签: c# winforms scroll panel

我的FlowLayoutPanel包含User Controls,从上到下包含垂直滚动条。

与任何其他可滚动控件一样,我可以逐个像素地滚动它。

有没有办法(.NET Framework或原生API方式)在User Control之后滚动它User Control,以便捕捉到下一个或上一个User Control?它们可以有不同的高度。

我想逐行滚动显示DataGridView Excel / Calc

2 个答案:

答案 0 :(得分:0)

我这个问题 - How to make scrollviewer scroll pixels not components (wpf),你期望的行为是不受欢迎的。因此,您可以执行用户在所描述的问题中所做的事情。

您的问题与引用的问题之间的本质区别在于主机控制。您已使用FlowLayoutPanel,并在引用的问题StackPanel中使用。

那么,如果您的应用程序是WPF应用程序,您可以将其更改为StackPanel吗?

在FlowLayoutPanel上使用AutoScroll=True设置这些属性WrapContent=True不起作用吗?

答案 1 :(得分:0)

快速而肮脏的解决方案。

设置AutoScroll=false,添加VScrollBar,并输入以下代码:

vScrollBar1.Maximum = MyList.VerticalScroll.Maximum;
vScrollBar1.SmallChange = MyList.VerticalScroll.SmallChange;
vScrollBar1.LargeChange = MyList.VerticalScroll.LargeChange;
vScrollBar1.Scroll += (sender, args) =>
{
    switch (args.Type)
    {
        case ScrollEventType.ThumbTrack:

            var sum = 0;
            Control prevCtrl = null;

            foreach (Control control in MyList.Controls)
            {
                if (prevCtrl == null || control.Bottom > prevCtrl.Bottom)
                {
                    if (args.OldValue >= sum && args.OldValue < sum + control.Height)
                    {
                        MyList.AutoScrollPosition = new Point(0, sum);
                    }

                    sum += control.Height;
                }

                prevCtrl = control;
            }

            break;
    }
}