C# 通过控制(非平滑)滚动面板实现控制
我有一个C# 通过控制(非平滑)滚动面板实现控制,c#,winforms,scroll,panel,C#,Winforms,Scroll,Panel,我有一个FlowLayoutPanel,其中包含用户控件以及垂直滚动条 像任何其他可滚动控件一样,我可以逐像素滚动它 是否有一种方法(.NET Framework或本机API方式)通过用户控件滚动它,以便捕捉到下一个或上一个用户控件?它们可以有不同的高度 我想复制DataGridView或Excel/Calc逐行滚动类型。我想回答这个问题-,您期望的行为是不需要的。因此,您可以执行用户在所述问题中所做的操作 您的问题与引用的问题之间的本质区别在于主机控制。您已经使用了FlowLayoutPane
FlowLayoutPanel
,其中包含用户控件
以及垂直滚动条
像任何其他可滚动控件一样,我可以逐像素滚动它
是否有一种方法(.NET Framework或本机API方式)通过用户控件滚动它,以便捕捉到下一个或上一个用户控件?它们可以有不同的高度
我想复制DataGridView
或Excel/Calc逐行滚动类型。我想回答这个问题-,您期望的行为是不需要的。因此,您可以执行用户在所述问题中所做的操作
您的问题与引用的问题之间的本质区别在于主机控制。您已经使用了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;
}
}
vScrollBar1.max=MyList.VerticalScroll.max;
vScrollBar1.SmallChange=MyList.VerticalScroll.SmallChange;
vScrollBar1.LargeChange=MyList.VerticalScroll.LargeChange;
vScrollBar1.Scroll+=(发送方,参数)=>
{
开关(参数类型)
{
案例ScrollEventType.ThumbTrack:
var总和=0;
控件prevCtrl=null;
foreach(MyList.Controls中的控件)
{
if(prevCtrl==null | | control.Bottom>prevCtrl.Bottom)
{
如果(args.OldValue>=sum&&args.OldValue
我现在不打算使用WPF(托管控件),除非没有其他解决方案。AutoScroll=true
和WrapContent=false
,以便创建控件列表。如果您知道必要的数量,您不能将其添加到垂直滚动.Value
(或水平滚动.Value
)中吗?我可以。问题是当用户使用鼠标滚动面板时,如何防止面板在两个控件之间滚动。