Как программно прокручивать панель

у меня есть 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)