Статьи

WP7 Silverlight Элементы управления макетом: элемент Canvas

Есть три элемента управления, используемые для макета в Silverlight. Сетка, Стеклопанель и Холст.

Контроль холста

Silverlight предоставляет элемент Canvas, который можно использовать для группировки связанного содержимого. Элемент Canvas может иметь вложенные дочерние элементы. Обычно он используется, когда дети должны быть расположены в точных координатах x и y.

Элемент управления StackPanel

Элемент управления StackPanel представляет собой простую панель макета, которая упорядочивает содержимое в одну строку, которая может быть ориентирована по горизонтали или вертикали (по умолчанию). Элемент управления StackPanel позволяет нам размещать объекты один поверх другого или рядом друг с другом.

Grid Control

Элемент управления Grid позволяет определять информацию о строках и столбцах в одном месте с помощью тегов RowDefinition и ColumnDefinition.

 

Чтобы получить лучшее представление об этих элементах управления, я создал новый проект и перетащил элемент управления canvas в свою основную форму:

Layout1

Если я посмотрю на свой код XAML, то увижу, что Margin показывает мне, где расположен элемент управления canvas:

<Canvas Height="100"
        HorizontalAlignment="Left"
        Margin="108,86,0,0"
        Name="canvas1"
        VerticalAlignment="Top"
        Width="200" />

Если я перемещу этот элемент управления, это число изменится. Что происходит, когда я нажимаю на эти стрелки?

Layout2

Позиция все та же. Это просто интерпретируется по-разному:

<Canvas Height="100"
        HorizontalAlignment="Right"
        Margin="0,0,148,421"
        Name="canvas1"
        VerticalAlignment="Bottom"
        Width="200" />

Нажав на эти стрелки, я изменил HorizontalAlignment и VerticalAlignment, а также изменил Margin.

Давайте предположим, что я хочу центрировать свой элемент управления canvas прямо по центру панели содержимого, я бы зашел в окно свойств и изменил и VerticalAlignment, и HorizontalAlignment на «Stretch». Следующее, что я делаю, это устанавливаю все поля на «0». Маржа содержит 4 числа, разделенных запятыми. И они представляют левую сторону, верх, правую сторону и низ:

layout3

В любом случае, если заменить все поля на «0», мой элемент управления canvas будет посередине:

layout4

Давайте продолжим и посмотрим, как это с Grid Control. Я удаляю этот элемент управления canvas и перетаскиваю элемент управления Grid в свою основную форму:

layout5

Мой код XAML показывает, что в моей ContentPanel есть новый Grid Control:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <Grid Height="302"
          HorizontalAlignment="Left"
          Margin="67,156,0,0"
          Name="grid1"
          VerticalAlignment="Top"
          Width="314" />

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

Итак, позвольте мне определить две строки и два столбца, добавив немного кода. Сначала я должен закрыть Грид. Я удаляю косую черту сразу после ширины и добавляю одну </ Grid>

Теперь я могу добавить свой код между ними:

<Grid.RowDefinitions>
    <RowDefinition Height="80" />
    <RowDefinition Height="80*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="100*" />
    <ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>

Я определил две строки: первый 80 пикселей в высоту, второй 80 пикселей плюс то, что осталось от этой области. Если бы я просто поставил там звездочку, он бы заполнил весь контроль. И я определил два столбца размером 100 плюс и 100 пикселей:

layout6

Если в основной форме навести курсор на элемент управления сеткой, я могу добавить дополнительные строки и столбцы, просто щелкнув мышью. Если я хочу избавиться от строки или столбца, я просто выбираю его и перетаскиваю.

Щелчок правой кнопкой мыши внутри моего Grid Control дает мне больше возможностей. Или я могу пойти в окно свойств и там выбрать RowDefinition или ColumnDefinition. Это вызывает Редактор Коллекции, где я могу добавить больше строк или столбцов и установить их свойства:

Layout7

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

<Button Width="100"
        Height="100"
        Content="Hi"
        Grid.Row="1"
        Grid.Column="0" />

Элемент управления кнопки обычно не имеет свойства Grid.Row или GridColumn. Он получает эти свойства только тогда, когда находится внутри Grid. Эти свойства называются «прикрепленными свойствами».

layout8

Кнопка находится в строке 1 и в столбце 0.

Давайте посмотрим на элемент управления StackPanel.

StackPanel довольно прост. Все элементы управления, содержащиеся в StackPanel, отображаются в вертикальной стопке.

Сейчас я перетаскиваю элемент управления StackPanel в основную форму. Затем я добавляю несколько текстовых блоков, набирая код:

<StackPanel Height="168"
            HorizontalAlignment="Left"
            Margin="39,46,0,0"
            Name="stackPanel1"
            VerticalAlignment="Top"
            Width="378">
    <TextBlock Text="FirstOne" />
    <TextBlock Text="SecondOne" />
    <TextBlock Text="ThirdOne" />
    <TextBlock Text="FourthOne" />
 
</StackPanel>

Обратите внимание, что, как и раньше с элементом управления Grid, я закрыл </ StackPanel>, чтобы иметь возможность добавлять свой код.

б

У меня есть четыре текстовых блока, сложенных друг на друга.

Давайте продолжим и добавим файл CanvasPage.xaml в мой проект. Я перетаскиваю элемент управления canvas на правую страницу, созданную. Предположим, мне нужно расположить различные элементы управления в очень определенных местах на экране. Это то, для чего предназначен Canvas. Вместо использования полей для определения положения элементов управления внутри холста, с помощью прикрепленных свойств элементы управления определяют свойства left и top относительно верхнего левого угла самого холста.

Я перетащил два текстовых блока в свой элемент управления canvas. Глядя на мой код XAML, я замечаю, что оба текстовых блока имеют свойство top и свойство left:

<TextBlock Canvas.Left="26"
           Canvas.Top="23"
           Height="30"
           Name="textBlock1"
           Text="TextBlock" />
<TextBlock Height="30"
           Name="textBlock2"
           Text="TextBlock"
           Canvas.Left="170"
           Canvas.Top="171" />

Если я переместу холст, чтобы изменить его положение, свойства «top» и «left» текстовых блоков внутри холста останутся прежними.

Сd

 

Продолжение следует…

Источник:  http://andreahaubner.blog.com/2011/02/21/layout-controls-in-silverlight/