Как программно прокручивать панель
у меня есть 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);
значения X и Y при Автопрокрутке остаются 0 и 0.
любая помощь или направление на этом были бы очень признательны.
заранее спасибо,
Марван
6 ответов
вот решение. Я думаю, вы можете прокрутить свой Panel
произвольным положением с помощью Win32
однако есть простой трюк, который поможет вам достичь вашего требования здесь:
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
.
попробуйте это:- панель.ScrollControlIntoView (childcontrol);
Это должно работать. childcontrol-это конкретный элемент управления, который вы хотите отобразить в области отображения.
если у вас есть класс, производный от 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 King'S решение о создании временного контроля только для того, чтобы прокрутка могла быть сделана, казалось мне "тяжелым". И предложение @Hans Passant о настройке AutoScrollMinSize
и AutoScrollPosition
не работать на меня.
оставить AutoScroll
к значению по умолчанию 'true'.
используйте @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;
У меня была проблема, когда я не мог заставить свою панель прокручиваться обратно наверх . Я пробовал много вещей, чтобы попытаться заставить панель прокручиваться обратно наверх после заполнения ее многими элементами управления.
Nomatter, что я сделал, он всегда ставил панель VScroll на дно.
после исчерпывающего тестирования я обнаружил, что это потому, что мой контроль был остановка табуляции свойство установлено в true (по умолчанию для пользовательских элементов управления) вызывает проблему.
установка tabstop в false исправил.
Это удивительно работает! Обратите внимание на знак минус в коде. При установке положения прокрутки наблюдается странное поведение. Если вы установите для позиции точное значение (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)