Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Комбинирование преобразований.




Можно совместно применять преобразования в режимах LayoutTransform и RenderTransform. Или вычислить матрицу преобразования MatrixTransform. TransformGroup Его задача - скомбинировать несколько дочерних объектов типа Transform.

В процедурном коде объекты отдельных преобразований добавляются в коллекцию Children, в XAML это делается следующим образом:

<Button>

<Button.RenderTransform>

<TransformGroup>

<RotateTransform Angle="45"/>

<ScaleTransformScaleX="5" ScaleY="1"/>

<SkewTransformAngleX="30"/>

</TransformGroup>

</Button.RenderTransform>

OK

</Button>

Компоновка с помощью панелей.

Компоновка - важнейший фактор, обеспечивающий удобство работы с приложением на различных устройствах. Можно, конечно, размещать элементы пользовательского интерфейса статически, задавая координаты и размеры в пикселах, и где-то это даже будет работать, однако такое решение «посыпется» под воздействием самых разных факторов: разная разрешающая способность, заданные пользователем настройки, к примеру, размер шрифта, содержимое, изменяющееся непредсказуемым образом.

Z-порядок по умолчанию (задающий, какие элементы располагаются «поверх» других) определяется порядком добавления дочерних элементов к родителю. В XAML это определяется порядком следования дочерних элементов в файле. Элементы, добавленные позже, располагаются поверх элементов, добавленных раньше.

Однако Z-порядок любого элемента можно задать явно, указав для него присоединенное свойство ZIndex, определенное в классе Panel (и наследуемое всеми панелями). ZIndex- это целое число, по умолчанию равное 0; оно может принимать любое целое значение (положительное или отрицательное). Элементы с большим значением ZIndex рисуются поверх элементов с меньшим значением.

Если для нескольких элементов задано одно и то же значение ZIndex, то их взаимное расположение определяется порядком следования в коллекции Children панели, как в случае по умолчанию.

Панель Canvas.

Canvas(холст) - самая простая панель. Canvas поддерживает только «классическое» позиционирование элементов путем явного задания координат; впрочем, координаты хотя бы задаются в независимых от устройства пикселах, в отличие от прежних систем конструирования пользовательских интерфейсов. Панель Canvas позволяет задавать координаты относительно любого, а не только левого верхнего угла. Позиционирование элемента на холсте осуществляется с помощью присоединенных свойств: Left, Top, Right и Bottom. Задавая значение Left или Right, вы определяете, что ближайшая сторона элемента должна всегда отстоять на фиксированное расстояние от соответствующей стороны холста. То же самое относится к свойствам Тор и Bottom. По сути дела, вы указываете угол, к которому «примыкает» каждый элемент, а значения присоединенных свойств выступают в роли полей (к которым добавляются значения самого свойства Margin элемента). Если для некоторого элемента не задано ни одно присоединенное свойство (то есть все они имеют значение по умолчанию Double.NaN), то он помещается в левый верхний угол (что эквивалентно установке для Left и Тор значения 0).

Для элемента нельзя задавать более двух присоединенных свойств Canvas

Панель StackPanel.

Панель StackPanel последовательно размещает своих потомков в виде стопки.

В отсутствие присоединенных свойств единственный способ организова дочерние элементы - воспользоваться свойством панели Orientation, которое может принимать значение Horizontal или Vertical. По умолчанию подразумевается ориентация Vertical.

выравнивание HorizontalAlignment и VerticalAlignment игнорируется в направлении сборки стопки. При комбинировании компоновки Stretch преобразованием RotateTransform или SkewTransform, применяемым в режиме LayoutTransform, растяжение происходит, только если угол кратен 90. Это поведение не является особенностью StackPanel, а присутствует всюду, где элемент растягивается только в одном направлении. Эта странность проявляется, только когда преобразование применяется в режиме LayoutTransform; RenderTransform она не относится.

Панель WrapPanel.

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

В классе WrapPanel определены три свойства, контролирующие его поведение:

Orientation- аналогично одноименному свойству StackPanel с тем отличием, что по умолчанию подразумевается значение Horizontal. элементы располагаются один за другим слева направо, а когда место кончается, переходят на следующую строку.

ItemHeight- единая высота для всех дочерних элементов. Каким образом каждый потомок распоряжается этой высотой, зависит от значений его свойств VerticalAlignment, Height и пр. Элементы, ширина которых превышает ItemHeight, отсекаются.

ItemWidth- единая ширина для всех дочерних элементов. Каким образом каждый потомок распоряжается этой шириной, зависит от значений его свойств HorizontalAlignment, Width и пр. Элементы, высота которых превышает ItemWidth, отсекаются.

По умолчанию свойства ItemHeight и ItemWidth не установлены.В этом случае панель WrapPanel с вертикальной ориентацией отводит каждому столбцу ширину, равную ширине самого широкого элемента в нем, а панель с горизонтальной ориентацией отводит каждой строке высоту, равную высоте самого высокого элемента в ней. Можно заставить панель WrapPanel располагать элементы в одну строку или в один столбец. Для этого следует присвоить свойству Width (в случае горизонтальной ориентации) или свойству Height(в случае вертикальной ориентации) значение Double.MaxValue либо Double.PositiveInfinity. В XAML это достигается с помощью расширения разметки х: Static, поскольку ни то ни другое значение не поддерживается конвертером типа System. Double.

Если свойство FlowDirection равно RightToLeft то для панели WrapPanel с вертикальной ориентацией новый столбец создается слева от заполненного, а для панели с горизонтальной ориентацией заполнение строки производится справа налево.

Выравнивание HorizontalAlignment и VerticalAlignment можно задавать в направлении, противоположном направлению роста стопки, как и в случае StackPanel. Но выравнивание может быть полезно и в направлении роста стопки, если значение ItemHeight или ItemWidth таково, что в элементе имеется дополнительное пространство для выравнивания

Панель DockPanel.

Панель DockPanel дает простой способ пристыковки элемента к одной из сторон, растягивая его на всю имеющуюся ширину или высоту. (Отличие от Canvas заключается в том, что элементы пристыковываются не к одному углу, а ко всей стороне.) Кроме того, DockPanel позволяет расположить один элемент» так чтобы он занял все место, свободное от пристыкованных элементов.

В классе DockPanel определено присоединенное свойство Dock(типа System.Win- dows.Controls.Dock), с помощью которого дочерние элементы могут управлять своим положением. Оно может принимать четыре значения: Left, Top, Right и Bottom.

Отметим, что у свойства Dock нет значения Fill, означающего, что нужно заполнить оставшееся место. Вместо этого действует соглашение о том, что все оставшееся место отдается последнему дочернему элементу, добавленному в DockPanel, если только свойство LastChildFill не равно false. Если LastChildFill равно true(по умолчанию), то значение свойства Dock, заданное для последнего добавленного элемента, игнорируется. Если же оно равно false, то последний элемент можно пристыковать к любой стороне. Если к одной стороне пристыковано несколько элементов, то они просто организуются в стопку соответствующего направления.

Как и в случае StackPanel, растяжение элементов определяется подразумеваемым по умолчанию значением свойства HorizontalAlignment или VerticalAlignment. Если элемент не будет занимать все пространство, выделенное ему панелью DockPanel, то можно задать другое выравнивание. 

Панель DockPanel полезна для организации верхнего уровня интерфейса внутри элемента Window или Page, когда пристыкованные элементы по большей части представляют собой другие панели, где и находится все самое важное. Так, обычно к верхней стороне пристыковывается меню (Menu), справа и слева находятся какие-то панели, а снизу - строка состояния (StatusBar). Центральную же часть занимают основные данные приложения.

Панель Grid.

(сетка) - самая гибкая из всех панелей и, пожалуй, наиболее употребительная. Она позволяет расположить дочерние элементы в несколько строк и несколько столбцов, не полагаясь на режим автоматического переноса. Работа с панелью Grid очень напоминает использование элемента TABLE в HTML.

Определяем количество строк и столбцов, помещая нужное число элементов RowDefinition и ColumnDefinition внутрь элементов, соответствующих свойствам сетки RowDefinitions и ColumnDefinitions. Затем позиционируем дочерние элементы с помощью присоединенных свойств Row и Column, принимающих целочисленные значения, начиная с 0.

Ячейки сетки можно оставлять пустыми, и, наоборот, в одной ячейке может находиться несколько элементов. В таком случае они просто располагаются один над другим в соответствии с заданным Z-порядком.

Свойства RowSpan и ColumnSpan указывают на количество строк столбцов, занимаемых данной ячейкой. По умолчанию они равны 1

Автоматический выбор размера достигается присваивания свойствам Height и Width соответственно в элементах RowDefinition и ColumnDefinition специального значения Auto, нечувствительного к регистру букв.

Виды привязки в WPF.

В отличие от всех прочих свойств Height и Width в WPF, в Grid они имеют тип System.Windows.GridLength, а не double. Поэтому панель Grid поддерживает три способа задания размера в элементах RowDefinition и ColumnDefinition: 

Абсолютный размер - числовое значение HeightилиWidth означает, что размер задан в независимых от устройства. В отличие от других способов задания размера, абсолютные значения не позволяют строкам и столбцам увеличиваться или сжиматься при изменении размера самой сетки Grid или находящихся внутри нее элементов.

Автоматический выбор размера – если Height или Width равно, то дочерним элементам выделяется столько места, сколько необходимо, но не больше. Для строки эта величина равна высоте самого высокого элемента, а для столбца - ширине самого широкого элемента.

Пропорциональное изменение размера - (иногда называется размером «звездочка») предусмотрен специальный синтаксис задания свойств Height и Width, позволяющий распределить имеющееся пространство поровну или в соответствии с заданными пропорциями. Если задано пропорциональное изменение размера, строка и столбец увеличиваются или сжимаются при изменении размера сетки.

 С абсолютным и автоматическим заданием размера все понятно, но вот пропорциональное измерение требует пояснений. Звездочка работает следующим образом:

Если высота строки или ширина столбца равна *, то соответствующему структурному элементу выделяется все оставшееся место.

 Если размер * задан для нескольких строк или столбцов, то все оставшееся место делится между ними поровну.

Перед символом * можно указывать коэффициент (например, 2* или 5.5*), тогда соответствующей строке или столбцу будет выделено пропорционально больше места, чем остальным строкам или столбцам, в размере которых присутствует символ *. Столбец шириной 2* всегда в два раза шире столбца шириной * (это означает в точности то же самое, что 1*) в той же самой сетке. Столбец шириной 5.5* в два раза шире столбца шириной 2.75* в той же самой сетке.

Еще одна привлекательная особенность панели Grid— поддержка интерактивного изменения размера строк и столбцов мышью или клавишами (или стилусом, или пальцем — в зависимости от имеющегося оборудования).

В сетку Grid можно добавить произвольное число дочерних элементов GridSplitter, указав для них присоединенные свойства Grid.Row, Grid.Column, Grid.RowSpan и/или Grid.ColumnSpan. 

Буксировка GridSplitter изменяет размер по меньшей мере одной ячейки. Что происходит с остальными - изменение размера или просто перемещение - зависит от заданного способа изменения размера: пропорционально или как-то иначе.

Хотя GridSplitter, по умолчанию располагается в одной ячейке, его действие всегда распространяется на весь столбец или на всю строку. Поэтому лучше задавать для него свойство ColumSpan или RowSpan, так чтобы он пересекал всю сетку.

В классе GridSplitter свойство HorizontalAlignment по умолчанию равно Right, а свойство VerticalAlignment - Stretch, поэтому по умолчанию он примыкает к правой стороне указанной ячейки.

Чтобы элемент GridSplitter был виден и доступен для использования, его ширина Width(или высота Height - в зависимости от ориентации) должна быть задана явно.

В классах RowDefinitions и ColumnDefinitions имеется свойство SharedSizeGroup позволяющее задать режим, при котором линейные размеры нескольких строк и/или столбцов будут оставаться одинаковыми даже в случае, когда размер любой из них изменяется в процессе выполнения программы. Свойству SharedSizeGroup можно присвоить произвольное строковое значение оно интерпреруется как имя группы.










Последнее изменение этой страницы: 2018-04-12; просмотров: 230.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...