Класс ScrollViewer
96WPF --- Элементы управления WPF --- Класс ScrollViewer
Прокрутка необходима, если нужно поместить большой объем содержимого в ограниченную область. Для обеспечения прокрутки в 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 для программной прокрутки содержимого:
Наиболее понятны методы LineUp() и LineDown(), которые эквивалентны щелчкам на кнопках со стрелками на концах вертикальной полосы прокрутки для смещения вверх или вниз.
Можно также использовать методы PageUp() и PageDown(), которые прокручивают содержимое на один экран вверх или вниз и эквивалентны щелчкам на поверхности полосы прокрутки выше или ниже ползунка.
Существуют аналогичные методы для горизонтальной прокрутки: LineLeft(), LineRight(), PageLeft() и PageRight().
И, наконец, имеются методы ScrollToXxx() для перемещения в некоторые конкретные места. Для вертикальной прокрутки это методы ScrollToEnd() и ScrollToHome(), которые выполняют сдвиг в конец или начало прокручиваемого содержимого, и ScrollToVerticalOffset(), который выполняет сдвиг в конкретную позицию. Имеются и горизонтальные варианты этих методов: ScrollToLeftEnd(), ScrollToRightEnd() и ScrollToHorizontalOffset().
Специальные способы прокрутки
Встроенные в ScrollViewer способы прокрутки весьма полезны. Они позволяют выполнять плавную прокрутку любого содержимого — от сложных векторных изображений до сетки с элементами. Однако одной из наиболее интересных возможностей класса ScrollViewer является то, что он позволяет содержимому принимать участие в процессе прокрутки. Вот как это работает:
Помещаете прокручиваемый элемент внутри элемента ScrollViewer. Это может быть любой элемент, реализующий интерфейс IScrollInfo.
Указываете объекту ScrollViewer, что содержимое знает, как выполнять прокрутку, для этого нужно установить свойство ScrollViewer.CanContentScroll равным true.
При задействовании элемента ScrollViewer (с помощью полосы прокрутки, колесика мыши, методов прокрутки и т.д.) он вызывает соответствующие методы вложенного элемента с помощью интерфейса IScrollInfo. Затем этот элемент выполняет собственную специализированную прокрутку.
В интерфейсе IScrollInfo определен набор методов, которые реагируют на различные действия прокрутки. Например, он содержит многие методы прокрутки, имеющиеся в ScrollViewer, такие как LineUp(), LineDown(), PageUp() и PageDown(). Кроме того, в нем имеются методы реагирования на колесико мыши.
Интерфейс IScrollInfo реализован в очень немногих элементах. Одним из них является контейнер StackPanel. В его реализации IScrollInfo используется логическая прокрутка, т.е. прокрутка, которая выполняет перемещение от элемента к элементу, а не от строки к строке.
Если поместить элемент StackPanel на ScrollViewer без установки свойства CanContentScroll, то вы получите обычное поведение. Прокрутка вверх и вниз выполняет сдвиги по нескольку пикселей. Но если задать свойство CanContentScroll равным true, то при каждом щелчке вниз будет выполняться прокрутка до начала следующего элемента.
Система логической прокрутки StackPanel может вам нравиться или не нравиться. Но она абсолютно необходима для создания пользовательской панели с особым поведением прокрутки.