Проблема с автопрокруткой в ​​mousedown - PullRequest
4 голосов
/ 13 февраля 2011

У меня есть собственный элемент управления внутри панели автопрокрутки.Когда пользовательский элемент управления выходит за пределы ширины панели, появляются полосы прокрутки.Когда вы затем прокручиваете любое расстояние и опускаете на элемент управления, полоса прокрутки возвращается к 0. Кто-нибудь знает, почему это может быть?Я уверен, что нигде не пытаюсь изменить значение полосы прокрутки ...

Спасибо

РЕДАКТИРОВАТЬ: это происходит только один раз, при первом нажатии на неекаждый раз, когда он работает, как ожидалось

РЕДАКТИРОВАТЬ 2: Это также происходит, когда вы открываете новое окно, а затем возвращаетесь в окно C #

Ответы [ 2 ]

1 голос
/ 13 февраля 2011

Если у вас есть элемент управления (например, TextBox), который намного шире его контейнера, и вы прокручиваете его до конца, затем щелкните элемент управления, и вы вернетесь назад к Location элемента управления.

Элемент управления, на который нажали, получает фокус, и прокрутка происходит автоматически, что является стандартным поведением winforms.

Если вы хотите отрицать это, вам придется перехватить SetAutoScrollPosition контейнера (ScrollableControl) или использовать другой механизм для возврата в исходное положение.

Если элемент управления уже имеет фокус, и вы затем прокручиваете, его повторное нажатие не изменит AutoScrollPosition контейнера.

0 голосов
/ 10 сентября 2018

Я разработал это для VB.net.Чтобы попробовать это, создайте проект WinForms и:

  1. Поместите Panel1 в Form1 и TextBox1 внутри Panel1.
  2. Сделайте TextBox1 больше чем Panel1 и заполните его кучей текста.
  3. Установите для Panel1.AutoScroll значение true.
  4. Добавьте Button1 в Form1 и установите его TabIndex на 0, чтобы захватить фокус при загрузке.

Запустите проект, переместитепрокрутите панель Panel1, а затем щелкните текст в TextBox1.TextBox1 будет раздражать, когда Panel1 попытается прокрутить верхний левый угол TextBox.Теперь поместите код ниже в форму Form1 и повторите тест.Намного приятнее!Это работало в VB 2010 Express.

Delegate Sub AutoScrollPositionDelegate(ByVal sender As ScrollableControl, ByVal p As Point)
Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter

   Dim p As Point = Panel1.AutoScrollPosition
   Dim del As AutoScrollPositionDelegate = New AutoScrollPositionDelegate(AddressOf SetAutoScrollPosition)

   Panel1.BeginInvoke(del, {Panel1, p})

End Sub
Private Sub SetAutoScrollPosition(ByVal sender As ScrollableControl, ByVal p As Point)

   p.X = Math.Abs(p.X)
   p.Y = Math.Abs(p.Y)
   sender.AutoScrollPosition = p

End Sub
...