Scrollbar не обновляется при изменении значения прокрутки

при установке VerticalScroll.Value на Panel С AutoScroll значение true, положение прокрутки изменяется соответственно, но положение большого пальца не делает. Нужно ли мне как-то обновлять полосу прокрутки (Invalidate(true) на панели не работает)? Есть идеи?

4 ответов


позвонить .PerformLayout();


спасибо .PerformLayout() совет!

в моем случае этого было недостаточно, я устанавливаю VerticalScroll.Значение в форме Form.Shown обработчик событий, и по какой-то причине мне пришлось добавить DoEvents инструкция заранее для прокрутки к работе.

вот мой Shown обработчик событий:

Private Sub MyForm_Shown(sender As System.Object, e As System.EventArgs) Handles Me.Shown
    System.Windows.Forms.Application.DoEvents()

    ScrollPanel.VerticalScroll.Value = ScrollPanel.VerticalScroll.Maximum
    ScrollPanel.PerformLayout()
End Sub

управление ScrollPanel имеет тип System.Windows.Forms.Panel.

без Application.DoEvents() line, настройка значения вертикальной прокрутки была полностью игнорируемый.

Я подумал, что это может пригодиться кому-то еще.


У меня была точно такая же проблема при попытке автопрокрутки панели, содержащей окно изображения.

Я нашел другой способ заставить его работать. Увеличьте значение прокрутки дважды:

ScrollPanel.VerticalScroll.Value += AmountToScroll

ScrollPanel.VerticalScroll.Value += AmountToScroll

увеличение значения в первый раз вызывает прокрутку окна изображения внутри панели, но.Значение не меняется, и большой палец не двигается.

увеличение значения во второй раз вызывает VerticalScroll.Значение должно быть увеличено, перемещая большой палец, но окно изображения не прокручивается снова.

Кажется мне ошибкой. Конечно, как прокрутка окна изображения ,так и приращение.Значение и движение большого пальца должно происходить после первой строки кода.


я столкнулся с чем-то почти идентичным, где у меня есть PictureBox (показывающий график) внутри панели с полосами прокрутки, и я хочу увеличить или уменьшить масштаб, сохраняя положение указателя мыши "по-видимому" неподвижным. Повторное позиционирование PictureBox внутри панели для этого сбрасывает синхронизацию с полосами прокрутки, а затем прокрутка с полосами прокрутки не будет показывать всю область PictureBox. Решение решение двигаться путем присвоения вычисленное значение к панель.Горизонтальскролл.Значение и / или панель.VerticalScroll.Свойство value. Но этого недостаточно: одно из этих двух решений требуется для того, чтобы приложение вело себя так, как задумано:

  1. решение KMan выше:

    panel.HorizontalScroll.Value = computed_value
    panel.PerformLayout()
    
  2. или решение JJMcLellan выше: в моем случае присвоение вычисленного значения дважды, например:

    panel.HorizontalScroll.Value = computed_value
    panel.HorizontalScroll.Value = computed_value
    

любой из них, по-видимому, имеет одинаковые конечные результаты. С #2 выше делает его похожим на ошибку, и #1 кажется (надеюсь), по дизайну Microsoft (?), Я использовал #1 в моем приложении. Я просто хотел подтвердить обе эти работы в VB.NET окружающая среда.