Pull to refresh

Недостижимый System.Windows.Forms.ScrollBar.Maximum

Reading time 2 min
Views 3.3K
Сегодня столкнулся с довольно странной вещью. При работе с Windows.Forms.ScrollBar пользователь не может достигнуть максимального значения. Ни мышью, ни клавиатурой нельзя установить бегунок на «максимум».
Например, пусть на форме есть hScrollBar (наследник ScrollBar).
Его свойства:
hScrollBar1.Minimum = 0,
hScrollBar1.Maximum = 100.
При таком раскладе пользователь не может получить значение hScrollBar1.Value больше 91, хотя максимум 100.
System.Windows.Forms.ScrollBar

Поначалу я грешил на .Net 4.0 beta, потом на Windows 7 RC. В моем сознании не укладывалось такое поведение элемента. Попросив знакомых проверить на более ранних версиях, я убедился — это видят все…

Нашел класс ScrollBar в MSDN, там подтвердили:
Наибольшее значение можно задать только программно. Это наибольшее значение для полосы прокрутки не может быть задано пользователем во время выполнения. Наибольшее значение, которое может задать пользователь, определяется по формуле: 1 плюс значение свойства Maximum минус значение свойства LargeChange. При необходимости можно задать для свойства Maximum размер объекта -1, чтобы значение этого выражения было равно 1.
Проверил, действительно, при hScrollBar1.LargeChange = 1, максимум достигается, но при этом page-прокрутка не отличается от обычной (±1 за действие).

Точного объяснения причин я так и не нашел. Но некоторые говорят, что такой эффект объясняется природой ScrollBar — текущее значение отражает положение левой (верхней) границы бегунка:
System.Windows.Forms.ScrollBar
Тогда почему при уменьшении свойства LargeChange размер бегунка остается прежним, а максимум достигается?
Ведь можно было, например, отражать положение центра бегунка в области между синими маркерами:
System.Windows.Forms.ScrollBar

В общем, это очень странное поведение элемента, и я подумал, что некоторым будет интересно знать это. Может быть кто-то сможет даже объяснить это? =)

P.S. В WPF ScrollBar честно пробегает по-умолчанию от 0 до 1.

UPD: А вот и объяснение, основанное на понятии «страница» — mrShadow в комментарии всё объяснил:
Кагбэ размер ползунка соответствует размеру области отображения (страницы), длина полосы прокрутки — размеру всей области, доступной для просмотра. Если ползунок находится в самой левой части полосы, его позиция — 0, а в области отображения — область от 0 до {размер страницы}. Соответственно, крайней правой области от {вся длина — размер страницы} до {вся длина} соответствует позиция ползунка {максимальное значение — размер ползунка}. Позиция ползунка {максимальное значение} соответствовала бы (несуществующей) области от {вся длина} до {вся длина + размер страницы }.
Tags:
Hubs:
+18
Comments 38
Comments Comments 38

Articles