通过控制(不平滑)滚动面板实现控制
Implementing control by control (not smooth) scrolling panel
我有一个 FlowLayoutPanel
,其中包含 User Controls
,从上到下带有垂直滚动条。
与任何其他可滚动控件一样,我可以逐像素滚动它。
有没有办法(.NET Framework 或本机 API 方式)将它 User Control
滚动 User Control
,以便捕捉到下一个或上一个 User Control
?它们可以有不同的高度。
我想复制 DataGridView
或 Excel/Calc 逐行滚动类型。
我这个问题 - How to make scrollviewer scroll pixels not components (wpf),您期望的行为是不需要的。因此,您可以执行用户在所述问题中所做的操作。
您的问题与所引用的问题之间的本质区别在于主机控制。您使用了 FlowLayoutPanel
并且在引用的问题中使用了 StackPanel
。
那么,如果您的应用程序碰巧是 WPF 应用程序,您可以将其更改为 StackPanel
吗?
在 FlowLayoutPanel 上使用 WrapContent=True
设置这些属性 AutoScroll=True
是否不起作用?
快速而肮脏的解决方案。
设置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;
}
}
我有一个 FlowLayoutPanel
,其中包含 User Controls
,从上到下带有垂直滚动条。
与任何其他可滚动控件一样,我可以逐像素滚动它。
有没有办法(.NET Framework 或本机 API 方式)将它 User Control
滚动 User Control
,以便捕捉到下一个或上一个 User Control
?它们可以有不同的高度。
我想复制 DataGridView
或 Excel/Calc 逐行滚动类型。
我这个问题 - How to make scrollviewer scroll pixels not components (wpf),您期望的行为是不需要的。因此,您可以执行用户在所述问题中所做的操作。
您的问题与所引用的问题之间的本质区别在于主机控制。您使用了 FlowLayoutPanel
并且在引用的问题中使用了 StackPanel
。
那么,如果您的应用程序碰巧是 WPF 应用程序,您可以将其更改为 StackPanel
吗?
在 FlowLayoutPanel 上使用 WrapContent=True
设置这些属性 AutoScroll=True
是否不起作用?
快速而肮脏的解决方案。
设置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;
}
}