实现一个控件接一个控件(不平滑)滚动面板

本文关键字:一个 控件 滚动 实现 平滑 | 更新日期: 2023-09-27 17:50:47

我有一个FlowLayoutPanel,包含User Controls从上到下与垂直滚动条。

和其他可滚动控件一样,我可以逐像素滚动它。

有办法吗?. NET框架或本地API方式)通过User Control滚动User Control,以便捕捉到下一个或以前的User Control ?它们可以有不同的高度。

我想复制DataGridViewExcel/Calc逐行滚动类型。

实现一个控件接一个控件(不平滑)滚动面板

我这个问题-如何使scrollviewer滚动像素而不是组件(wpf),您期望的行为是不需要的。因此,您可以做用户在所描述的问题中所做的事情。

你的问题和参考的问题之间的本质区别在于主机控制。您已经使用了FlowLayoutPanel,在参考问题中使用了StackPanel

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

设置这些属性AutoScroll=TrueWrapContent=True在FlowLayoutPanel不工作?

又快又脏的解决方案

设置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;
    }
}