Полоса прокрутки не обновляется при изменении значения прокрутки - PullRequest
8 голосов
/ 06 апреля 2011

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

Ответы [ 4 ]

25 голосов
/ 06 апреля 2011

Попробуйте позвонить .PerformLayout();

6 голосов
/ 18 апреля 2013

Спасибо за подсказку .PerformLayout()!

В моем случае этого было недостаточно, я устанавливаю VerticalScroll.Value в обработчике событий формы 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() значение вертикальной прокрутки было полностью проигнорировано.

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

0 голосов
/ 29 августа 2017

Я столкнулся с чем-то почти идентичным, когда у меня внутри панели с полосами прокрутки есть PictureBox (показывающий график), и я хочу увеличивать или уменьшать масштаб, сохраняя положение курсора мыши «на вид» неподвижным. Перестановка PictureBox внутри панели для этого исключает синхронизацию с полосами прокрутки, и после этого прокрутка с помощью полос прокрутки не покажет всю область PictureBox. Решение заключается в том, чтобы выполнить перемещение, назначив вычисленное значение для панели. Свойства HorizontalHroll.Value и / или panel.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.

0 голосов
/ 21 июля 2016

У меня была точно такая же проблема, когда я пытался прокрутить панель с графическим блоком.

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

ScrollPanel.VerticalScroll.Value += AmountToScroll

ScrollPanel.VerticalScroll.Value += AmountToScroll

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

При увеличении значения во второй раз значение VerticalScroll.Value увеличивается, перемещая большой палец, но графическое окно больше не прокручивается.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...