Поиск…


ContentPresenter

Менеджер макетов для шаблонных просмотров. Используется в ControlTemplate, чтобы отметить, где появится содержимое, которое будет представлено.

Макет ContentPresenter (изображение Xamarin)

ContentView

Элемент с одним контентом. ContentView очень мало использует свое собственное. Его цель - служить базовым классом для пользовательских сложных представлений.

Макет ContentView (изображение Xamarin)

XAML

<ContentView>
<Label Text="Hi, I'm a simple Label inside of a simple ContentView"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</ContentView>

Код

var contentView = new ContentView {
Content = new Label {
 Text = "Hi, I'm a simple Label inside of a simple ContentView",
 HorizontalOptions = LayoutOptions.Center,
 VerticalOptions = LayoutOptions.Center
}
};

Рамка

Элемент, содержащий один дочерний элемент, с некоторыми параметрами кадрирования. Рамка имеет значение по умолчанию Xamarin.Forms.Layout.Padding 20.

Рамка (изображение Xamarin)

XAML

<Frame>
<Label Text="I've been framed!"
HorizontalOptions="Center"
VerticalOptions="Center" />
</Frame>

Код

var frameView = new Frame {
Content = new Label {
 Text = "I've been framed!",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
},
OutlineColor = Color.Red
};

ScrollView

Элемент, способный прокручиваться, если это требует Content .

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

Макет ScrollView (изображение Xamarin)

Примечание. ScrollViews не должны быть вложенными. Кроме того, ScrollViews не должны ScrollViews другие элементы управления, которые обеспечивают прокрутку, например ListView и WebView .

ScrollView легко определить. В XAML:

<ContentPage.Content>
    <ScrollView>
        <StackLayout>
            <BoxView BackgroundColor="Red" HeightRequest="600" WidthRequest="150" />
            <Entry />
        </StackLayout>
    </ScrollView>
</ContentPage.Content>

То же определение в коде:

var scroll = new ScrollView();
Content = scroll;
var stack = new StackLayout();
stack.Children.Add(new BoxView { BackgroundColor = Color.Red,   HeightRequest = 600, WidthRequest = 600 });
stack.Children.Add(new Entry());

TemplatedView

Элемент, который отображает контент с помощью шаблона управления и базовый класс для ContentView .

Шаблон TemplatedView (изображение Xamarin)

AbsoluteLayout

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

AbsoluteLayout (изображение Xamarin)

Определение AbsoluteLayout в XAML выглядит так:

<AbsoluteLayout>
    <Label Text="I'm centered on iPhone 4 but no other device"
        AbsoluteLayout.LayoutBounds="115,150,100,100" LineBreakMode="WordWrap"  />
    <Label Text="I'm bottom center on every device."
        AbsoluteLayout.LayoutBounds=".5,1,.5,.1" AbsoluteLayout.LayoutFlags="All"
        LineBreakMode="WordWrap"  />
    <BoxView Color="Olive"  AbsoluteLayout.LayoutBounds="1,.5, 25, 100"
        AbsoluteLayout.LayoutFlags="PositionProportional" />
    <BoxView Color="Red" AbsoluteLayout.LayoutBounds="0,.5,25,100"
        AbsoluteLayout.LayoutFlags="PositionProportional" />
    <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,100,25"
        AbsoluteLayout.LayoutFlags="PositionProportional" />
    <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,1,25"
        AbsoluteLayout.LayoutFlags="PositionProportional, WidthProportional" />
</AbsoluteLayout>

Тот же макет будет выглядеть так в коде:

Title = "Absolute Layout Exploration - Code";
var layout = new AbsoluteLayout();

var centerLabel = new Label {
Text = "I'm centered on iPhone 4 but no other device.",
LineBreakMode = LineBreakMode.WordWrap};

AbsoluteLayout.SetLayoutBounds (centerLabel, new Rectangle (115, 159, 100, 100));
// No need to set layout flags, absolute positioning is the default

var bottomLabel = new Label { Text = "I'm bottom center on every device.", LineBreakMode = LineBreakMode.WordWrap };
AbsoluteLayout.SetLayoutBounds (bottomLabel, new Rectangle (.5, 1, .5, .1));
AbsoluteLayout.SetLayoutFlags (bottomLabel, AbsoluteLayoutFlags.All);

var rightBox = new BoxView{ Color = Color.Olive };
AbsoluteLayout.SetLayoutBounds (rightBox, new Rectangle (1, .5, 25, 100));
AbsoluteLayout.SetLayoutFlags (rightBox, AbsoluteLayoutFlags.PositionProportional);

var leftBox = new BoxView{ Color = Color.Red };
AbsoluteLayout.SetLayoutBounds (leftBox, new Rectangle (0, .5, 25, 100));
AbsoluteLayout.SetLayoutFlags (leftBox, AbsoluteLayoutFlags.PositionProportional);

var topBox = new BoxView{ Color = Color.Blue };
AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 100, 25));
AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional);

var twoFlagsBox = new BoxView{ Color = Color.Blue };
AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 1, 25));
AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayout.WidthProportional);

layout.Children.Add (bottomLabel);
layout.Children.Add (centerLabel);
layout.Children.Add (rightBox);
layout.Children.Add (leftBox);
layout.Children.Add (topBox);

Элемент AbsoluteLayout в Xamarin.Forms позволяет указать, где именно на экране вы хотите, чтобы дочерние элементы отображались, а также их размер и форма (границы).

Существует несколько различных способов установить границы дочерних элементов на основе перечисления AbsoluteLayoutFlags, которые используются во время этого процесса. Перечисление AbsoluteLayoutFlags содержит следующие значения:

  • Все : Все размеры пропорциональны.
  • HeightProportional : Высота пропорциональна расположению.
  • Нет : интерпретация не выполняется.
  • PositionProportional : Объединяет XProportional и YProportional.
  • SizeProportional : Объединяет WidthProportional и HeightProportional.
  • WidthProportional: Ширина пропорциональна макета.
  • XProportional : свойство X пропорционально компоновке.
  • YProportional : свойство Y пропорционально расположению.

Процесс работы с макетом контейнера AbsoluteLayout может показаться немного интуитивным вначале, но с небольшим использованием он станет привычным. Когда вы создадите дочерние элементы, чтобы установить их в абсолютном положении в контейнере, вам нужно выполнить три шага. Вы хотите установить флаги, назначенные элементам, используя метод AbsoluteLayout.SetLayoutFlags () . Вы также захотите использовать метод AbsoluteLayout.SetLayoutBounds (), чтобы дать элементам свои границы. Наконец, вы захотите добавить дочерние элементы в коллекцию Children. Так как Xamarin.Forms является абстракционным слоем между Xamarin и специфическими для устройства реализациями, позиционные значения могут быть независимы от пикселей устройства. Здесь упоминаются ранее упомянутые флаги компоновки. Вы можете выбрать, как процесс компоновки элементов управления Xamarin.Forms должен интерпретировать значения, которые вы определяете.

сетка

Макет, содержащий представления, расположенные в строках и столбцах.

Макет сетки (изображение Xamarin)

Это типичное определение Grid в XAML.

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="2*" />
    <RowDefinition Height="*" />
    <RowDefinition Height="200" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
    
  <ContentView Grid.Row="0" Grid.Column="0"/>
  <ContentView Grid.Row="1" Grid.Column="0"/>
  <ContentView Grid.Row="2" Grid.Column="0"/>

  <ContentView Grid.Row="0" Grid.Column="1"/>
  <ContentView Grid.Row="1" Grid.Column="1"/>
  <ContentView Grid.Row="2" Grid.Column="1"/>

</Grid>

Такая же Grid определенная в коде, выглядит так:

var grid = new Grid();
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength(2, GridUnitType.Star) });
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength (1, GridUnitType.Star) });
grid.RowDefinitions.Add (new RowDefinition { Height = new GridLength(200)});
grid.ColumnDefinitions.Add (new ColumnDefinition{ Width = new GridLength (200) });

Чтобы добавить элементы в сетку: В XAML :

<Grid>
      
   <--DEFINITIONS...--!>
        
   <ContentView Grid.Row="0" Grid.Column="0"/>
   <ContentView Grid.Row="1" Grid.Column="0"/>
   <ContentView Grid.Row="2" Grid.Column="0"/>

   <ContentView Grid.Row="0" Grid.Column="1"/>
   <ContentView Grid.Row="1" Grid.Column="1"/>
   <ContentView Grid.Row="2" Grid.Column="1"/>

</Grid>

В коде C #:

var grid = new Grid();
//DEFINITIONS...
var topLeft = new Label { Text = "Top Left" };
var topRight = new Label { Text = "Top Right" };
var bottomLeft = new Label { Text = "Bottom Left" };
var bottomRight = new Label { Text = "Bottom Right" };
grid.Children.Add(topLeft, 0, 0);
grid.Children.Add(topRight, 0, 1);
grid.Children.Add(bottomLeft, 1, 0);
grid.Children.Add(bottomRight, 1, 1);

Для Height и Width доступно несколько единиц.

  • Авто - автоматически размеры, соответствующие содержанию в строке или столбце. Указан как GridUnitType.Auto в C # или как Auto в XAML.
  • Пропорциональные столбцы и строки пропорционально оставшемуся пространству. Указывается как значение и GridUnitType.Star в C # и как # * в XAML, причем # является вашим желаемым значением. Указание одной строки / столбца на * приведет к заполнению доступного пространства.
  • Абсолютные размеры столбцов и строк с определенными фиксированными значениями высоты и ширины. Указывается как значение и GridUnitType.Absolute в C # и как # в XAML, причем # является вашим желаемым значением.

Примечание. Значения ширины столбцов по умолчанию заданы как «Авто» по умолчанию в Xamarin.Forms, что означает, что ширина определяется по размеру детей. Обратите внимание, что это отличается от реализации XAML на платформах Microsoft, где ширина по умолчанию - *, которая заполняет доступное пространство.

RelativeLayout

Layout который использует Constraints для компоновки своих детей.

RelativeLayout используется для размещения и размера представлений относительно свойств макета или представлений сестры. В отличие от AbsoluteLayout , RelativeLayout не имеет понятия движущегося якоря и не имеет средств для позиционирования элементов относительно нижнего или правого краев макета. RelativeLayout поддерживает элементы позиционирования за пределами собственных границ.

RelativeLayout (изображение Xamarin)

RelativeLayout в XAML выглядит следующим образом:

<RelativeLayout>
    <BoxView Color="Red" x:Name="redBox"
        RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,
            Property=Height,Factor=.15,Constant=0}"
        RelativeLayout.WidthConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Width,Factor=1,Constant=0}"
        RelativeLayout.HeightConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Height,Factor=.8,Constant=0}" />
    <BoxView Color="Blue"
        RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView,
            ElementName=redBox,Property=Y,Factor=1,Constant=20}"
        RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView,
            ElementName=redBox,Property=X,Factor=1,Constant=20}"
        RelativeLayout.WidthConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Width,Factor=.5,Constant=0}"
        RelativeLayout.HeightConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Height,Factor=.5,Constant=0}" />
</RelativeLayout>

Такой же макет может быть выполнен с помощью этого кода:

layout.Children.Add (redBox, Constraint.RelativeToParent ((parent) => {
        return parent.X;
    }), Constraint.RelativeToParent ((parent) => {
        return parent.Y * .15;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Width;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Height * .8;
    }));
layout.Children.Add (blueBox, Constraint.RelativeToView (redBox, (Parent, sibling) => {
        return sibling.X + 20;
    }), Constraint.RelativeToView (blueBox, (parent, sibling) => {
        return sibling.Y + 20;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Width * .5;
    }), Constraint.RelativeToParent((parent) => {
        return parent.Height * .5;
    }));

StackLayout

StackLayout организует представления в одномерной строке («стек»), горизонтально или вертикально. Views в StackLayout могут быть рассчитаны на основе пространства в макете с использованием параметров макета. Позиционирование определяется просмотрами заказов, которые были добавлены в макет и варианты макета представлений.

StackLayout (изображение Xamarin)

Использование в XAML

<StackLayout>
    <Label Text="This will be on top" />
    <Button Text="This will be on the bottom" />
</StackLayout>

Использование в коде

StackLayout stackLayout = new StackLayout
{
    Spacing = 0,
    VerticalOptions = LayoutOptions.FillAndExpand,
    Children = 
    {
        new Label
        {
            Text = "StackLayout",
            HorizontalOptions = LayoutOptions.Start
        },
        new Label
        {
            Text = "stacks its children",
            HorizontalOptions = LayoutOptions.Center
        },
        new Label
        {
            Text = "vertically",
            HorizontalOptions = LayoutOptions.End
        },
        new Label
        {
            Text = "by default,",
            HorizontalOptions = LayoutOptions.Center
        },
        new Label
        {
            Text = "but horizontal placement",
            HorizontalOptions = LayoutOptions.Start
        },
        new Label
        {
            Text = "can be controlled with",
            HorizontalOptions = LayoutOptions.Center
        },
        new Label
        {
            Text = "the HorizontalOptions property.",
            HorizontalOptions = LayoutOptions.End
        },
        new Label
        {
            Text = "An Expand option allows one or more children " +
                   "to occupy the an area within the remaining " +
                   "space of the StackLayout after it's been sized " +
                   "to the height of its parent.",
            VerticalOptions = LayoutOptions.CenterAndExpand,
            HorizontalOptions = LayoutOptions.End
        },
        new StackLayout
        {
            Spacing = 0,
            Orientation = StackOrientation.Horizontal,
            Children = 
            {
                new Label
                {
                    Text = "Stacking",
                },
                new Label
                {
                    Text = "can also be",
                    HorizontalOptions = LayoutOptions.CenterAndExpand
                },
                new Label
                {
                    Text = "horizontal.",
                },
            }
        }
    }
};


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow