Главная » WPF » ScrollViewer

0

Всюду, где необходима прокрутка,  на помощь приходит элемент . Возможно,  вы обратили  внимание, что классы, реализующие полосы прокрутки, находятся  в пространстве имен Primitives; это объясняется тем, что их следует ис# пользовать  только  для прокрутки,  а единственный компонент,  который  должен реализовывать прокрутку,  – это .

Пользоваться элементом    следует с осторожностью,  так как в со# четании  с менеджерами  размещения он может давать неожиданные  результаты. Самая крупная  неприятность состоит в том, что для вычисления размера полосы прокрутки,   должен знать размеры своих дочерних элементов. Но ес# ли в качестве  потомков    выступают  менеджеры  размещения беско# нечного (в направлении прокрутки) размера,  то различные элементы  начинают путаться. Это относится, скажем, к FlowDocument и, как ни странно, к дочерним элементам .

Элемент    можно найти в визуальных стилях  большинства спис# ков и редакторов, вообще любого элемента, который по умолчанию способен отображать область, выходящую за пределы видимой поверхности. Чаще всего  делают корневым  элементом окна. Возможно, вы подумали, что та# кая организация позволит  без труда реализовать диалоговое окно, которое авто# матически получит полосы прокрутки,  если его сделать слишком маленьким. Действительно, это сработает, нужно лишь в качестве размера всех дочерних элементов, отображающих содержимое, указать Auto. Рассмотрим, к примеру, диалог на рис. 3.40.

Рис. 3.40. Диалоговое окно и список с полосой прокрутки

В нем имеется простая  сетка с тремя строками  (элемент  Grid будет подроб#

но рассматриваться в главе  4).  При  уменьшении размера  окна  хотелось  бы,

чтобы полосы прокрутки появлялись для окна в целом, а не только для спис# ка. Простое решение заключается в том, чтобы погрузить сетку внутрь :

<Window … x:Class=’EssentialWPF.Test’ Title=’’

< HorizontalScrollBarVisibility=’Auto’ VerticalScrollBarVisibility=’Auto’

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height=’Auto’ />

<RowDefinition Height=’Auto’ />

<RowDefinition />

</Grid.RowDefinitions>

<TextBox Margin=’5’ Grid.Row=’0’ Name=’_toAdd’ />

<Button Margin=’5’ Grid.Row=’1’ Click=’AddIt’>Add</Button>

<ListBox Margin=’5’ Grid.Row=’2’ Name=’_list’ />

</Grid>

</>

</Window>

void AddIt(object sender, RoutedEventArgs e) {

_list.Items.Add(_toAdd.Text);

}

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

   позволяет   «уместить»   в  ограниченное   пространство   произ# вольное  содержимое,  автоматически добавляя полосы  прокрутки,  если места перестает хватать. Еще один элемент, помогающий решить эту проблему, – Viewbox.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии