Класс ScrollViewer

96

Прокрутка необходима, если нужно поместить большой объем содержимого в ограниченную область. Для обеспечения прокрутки в WPF необходимо упаковать соответствующее содержимое в элемент ScrollViewer.

Объект ScrollViewer может содержать все, что угодно, но обычно это контейнер компоновки. Ниже представлен пример прокрутки:

<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible">
    <Grid>
        <Grid.RowDefinitions>
           ...
</ScrollViewer>
Включение прокрутки

Если в этом примере изменить размер окна, чтобы его размера хватило на все содержимое, полоса прокрутки станет неактивной, хотя и останется видимой. Этим поведением можно управлять с помощью свойства VerticalScrollBarVisibility, которое принимает одно из значений из перечисления ScrollBarVisibility. Стандартное значение Visible обеспечивает постоянное присутствие вертикальной полосы прокрутки. Значение Auto применяется, если нужно, чтобы полоса прокрутки появлялась, когда она нужна, и исчезала, когда не нужна. А значение Disabled позволяет полностью скрывает полосу прокрутки.

Есть еще значение Hidden, которое похоже на Disabled, но с небольшими отличиями. Во-первых, содержимое со скрытой полосой прокрутки все-таки можно прокручивать (например, с помощью клавиш со стрелками). Во-вторых, содержимое в ScrollViewer располагается по-другому. Используя Disabled, вы указываете, что содержимое в ScrollViewer может располагать только пространством самого элемента ScrollViewer. А использование Hidden указывает, что содержимое располагает неограниченным пространством. То есть оно может выходить за пределы прокручиваемой области.

Обычно значение Hidden используется, если предполагается выполнять прокрутку с помощью другого механизма (например, пользовательских кнопок прокрутки). А значение Disabled используется только если нужно временно запретить элементу ScrollViewer выполнять любые действия вообще.

Элемент ScrollViewer поддерживает и горизонтальную прокрутку. Однако по умолчанию свойство HorizontalScrollBarVisibility имеет значение Hidden. Для использования горизонтальной прокрутки необходимо изменить это значение на Visible или Auto.

Программная прокрутка

Для прокрутки окна, изображенного на рисунке, можно щелкнуть мышью на полосе прокрутки, можно поместить курсор над сеткой и использовать колесико мыши, можно перемещаться по элементам управления с помощью клавиши табуляции, либо можно щелкнуть где-то на пустом месте сетки и воспользоваться клавишами управления курсором. Если этого вам все еще мало, можно использовать методы класса ScrollViewer для программной прокрутки содержимого:

Специальные способы прокрутки

Встроенные в ScrollViewer способы прокрутки весьма полезны. Они позволяют выполнять плавную прокрутку любого содержимого — от сложных векторных изображений до сетки с элементами. Однако одной из наиболее интересных возможностей класса ScrollViewer является то, что он позволяет содержимому принимать участие в процессе прокрутки. Вот как это работает:

В интерфейсе IScrollInfo определен набор методов, которые реагируют на различные действия прокрутки. Например, он содержит многие методы прокрутки, имеющиеся в ScrollViewer, такие как LineUp(), LineDown(), PageUp() и PageDown(). Кроме того, в нем имеются методы реагирования на колесико мыши.

Интерфейс IScrollInfo реализован в очень немногих элементах. Одним из них является контейнер StackPanel. В его реализации IScrollInfo используется логическая прокрутка, т.е. прокрутка, которая выполняет перемещение от элемента к элементу, а не от строки к строке.

Если поместить элемент StackPanel на ScrollViewer без установки свойства CanContentScroll, то вы получите обычное поведение. Прокрутка вверх и вниз выполняет сдвиги по нескольку пикселей. Но если задать свойство CanContentScroll равным true, то при каждом щелчке вниз будет выполняться прокрутка до начала следующего элемента.

Система логической прокрутки StackPanel может вам нравиться или не нравиться. Но она абсолютно необходима для создания пользовательской панели с особым поведением прокрутки.

Пройди тесты
Лучший чат для C# программистов