如何以编程方式滚动面板
本文关键字:滚动 方式 编程 | 更新日期: 2023-09-27 18:23:54
我有一个包含一些内容的System.Windows.Forms.Panel
。
我正在尝试以编程方式向上或向下滚动面板(垂直)。
我试着在面板上将AutoScrollPosition
属性设置为新的Point
,但似乎没有效果
我已将AutoScroll
属性设置为true。
我甚至试着按照这里的建议设置两次VerticalScroll.Value
,但这似乎也不起作用。
这就是我目前正在做的事情:
//I have tried passing both positive and negative values.
panel.AutoScrollPosition = new Point(5, 10);
AutoScrollPosition上的X和Y值保持为0和0。
如有任何帮助或指导,我们将不胜感激
提前感谢
Marwan
这里有一个解决方案。我想你可以使用Win32
按任意位置滚动你的Panel
,但这里有一个简单的技巧可以帮助你达到你的要求:
public void ScrollToBottom(Panel p){
using (Control c = new Control() { Parent = p, Dock = DockStyle.Bottom })
{
p.ScrollControlIntoView(c);
c.Parent = null;
}
}
//use the code
ScrollToBottom(yourPanel);
或者为了方便使用扩展方法:
public static class PanelExtension {
public static void ScrollToBottom(this Panel p){
using (Control c = new Control() { Parent = p, Dock = DockStyle.Bottom })
{
p.ScrollControlIntoView(c);
c.Parent = null;
}
}
}
//Use the code
yourPanel.ScrollToBottom();
更新
如果你想设置确切的位置,修改上面的代码可以有所帮助:
//This can help you control the scrollbar with scrolling up and down.
//The position is a little special.
//Position for scrolling up should be negative.
//Position for scrolling down should be positive
public static class PanelExtension {
public static void ScrollDown(this Panel p, int pos)
{
//pos passed in should be positive
using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + pos })
{
p.ScrollControlIntoView(c);
}
}
public static void ScrollUp(this Panel p, int pos)
{
//pos passed in should be negative
using (Control c = new Control() { Parent = p, Height = 1, Top = pos})
{
p.ScrollControlIntoView(c);
}
}
}
//use the code, suppose you have 2 buttons, up and down to control the scrollbar instead of clicking directly on the scrollbar arrows.
int i = 0;
private void buttonUp_Click(object sender, EventArgs e)
{
if (i >= 0) i = -1;
yourPanel.ScrollUp(i--);
}
private void buttonDown_Click(object sender, EventArgs e)
{
if (i < 0) i = 0;
yourPanel.ScrollDown(i++);
}
您可能想要使用的另一个解决方案是使用Panel.VerticalScroll.Value
。然而,我认为你需要更多的研究才能使它如你所期望的那样发挥作用。因为我可以看到一旦更改Value
,滚动条位置和控件位置就不能很好地同步。请注意,Panel.VerticalScroll.Value
应介于Panel.VerticalScroll.Minimum
和Panel.VerticalScroll.Maximum
之间。
这惊人地有效!注意代码中的负号。设置滚动位置时出现了奇怪的行为。如果您将位置设置为精确值(50),则下次读取时(-50)会变为负值。因此,在设置新的滚动值之前,您必须将其反转。
向下滚动:
private void ButtonScrollDown_OnClick(object sender, EventArgs e)
{
Point current = yourScrollPanel.AutoScrollPosition;
Point scrolled = new Point(current.X, -current.Y + 10);
yourScrollPanel.AutoScrollPosition = scrolled;
}
类似地向上滚动,(-current.Y-10)
如果你有一个从Panel
派生的类,那么调用这两个受保护的方法来滚动面板:
// The bottom is off screen; scroll down. These coordinates must be negative or zero.
SetDisplayRectLocation(0, AutoScrollPosition.Y - item.BoundingRect.Bottom + ClientRectangle.Bottom);
AdjustFormScrollbars(true);
在我的示例中,item.BoundingRect.Bottom
是缩略图底部的Y坐标,我需要向下滚动面板,使整个缩略图可见。
@King创建一个临时控件以便进行滚动的解决方案对我来说似乎很"沉重"。@Hans Passant设置AutoScrollMinSize
和AutoScrollPosition
的建议对我不起作用。
将AutoScroll
保留为其默认值"true"。
试试这个:-面板滚动控制IntoView(子控件);
这应该行得通。childcontrol是要在显示区域中显示的特定控件。
设置HorizontalScroll
属性的值,然后使用适用于我的方法ScrollControlIntoView
:
lpanel.HorizontalScroll.Value = 100;
lpanel.ScrollControlIntoView(lpanel);
我遇到了一个问题,无法将面板滚动回顶部。我尝试了很多方法,试图在用许多控件填充面板后,让面板滚动回顶部。
无论我做了什么,它总是把VScroll栏放在底部。
经过详尽的测试,我发现是因为我的控件将TabStop属性设置为true(用户控件的默认值)导致了这个问题。
将TabStop设置为false修复了它。
使用@King King Answered Code,如果您想隐藏水平和垂直滚动条,只需在构造函数或初始化中应用以下代码即可。
yourPanel.AutoScroll = false;
yourPanel.HorizontalScroll.Maximum = 0;
yourPanel.HorizontalScroll.Visible = false;
yourPanel.VerticalScroll.Maximum = 0;
yourPanel.VerticalScroll.Visible = false;
yourPanel.AutoScroll = true;
创建一个稍微位于可见区域之外的控件(顶部为so-1,客户端大小为+1),然后调用ScrollControlIntoView:
public static class PanelExtension {
public static void ScrollDown(this Panel p)
{
using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + 1 })
{
p.ScrollControlIntoView(c);
}
}
public static void ScrollUp(this Panel p )
{
using (Control c = new Control() { Parent = p, Height = 1, Top = -1})
{
p.ScrollControlIntoView(c);
}
}
}
//use the code, suppose you have 2 buttons, up and down to control the scrollbar instead of clicking directly on the scrollbar arrows.
private void buttonUp_Click(object sender, EventArgs e)
{
yourPanel.ScrollUp();
}
private void buttonDown_Click(object sender, EventArgs e)
{
yourPanel.ScrollDown();
}
使用您的面板。设置自动滚动边距(1,1);您可以设置非常精细的滚动步骤,然后在按钮关闭时使用计时器调用srolling