Подтвердить что ты не робот

План макета в форматах Xamarin до нижнего

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

Ниже приведен снимок экрана, чтобы сделать вещи, надеюсь, немного более ясными. У меня есть stacklayout, который я заполняю headerlayout и contentlayout. Но если я просто добавлю footerlayout к stacklayout, он не будет прикреплен к нижней части страницы, но (логически) сразу за предыдущим ребенком. Теперь я думаю, что Absolutelayout выполнит трюк, но я не могу понять функциональность и Layoutflags и ее границы. Может ли кто-нибудь помочь мне?

My application

4b9b3361

Ответ 1

<StackLayout>
  <StackLayout Orientation="Horizontal" VerticalOptions="Start">
    <!-- top controls -->
  </StackLayout>

  <StackLayout VerticalOptions="CenterAndExpand">
    <!-- middle controls -->
  </StackLayout>

  <StackLayout Orientation="Horizontal" VerticalOptions="End">
    <!-- bottom controls -->
  </StackLayout>
</StackLayout>

Убедитесь, что у вас есть не более одного ребенка с параметрами Expand для лучшей производительности.

Ответ 2

Вы можете использовать VerticalOptions для отправки макета снизу.

var stacklayout = new stackLayout()
{
     VerticalOptions = LayoutOptions.EndAndExpand
     Children = {
      //your elements
     }
}

Ответ 3

В RelativeLayout я получил наилучшие результаты с определением ограничений высоты и Y.

<RelativeLayout>
        <StackLayout VerticalOptions="Start" BackgroundColor="Green"
                    RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=1}"
                    RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.25}">
          <!-- Top Content -->
          <Button Text="Top Button" Clicked="Button_OnClicked" />
        </StackLayout>

        <StackLayout VerticalOptions="Center" BackgroundColor="Aqua"
                          RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=1}"
                          RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.30}"
                          RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.6}">
          <!-- Mid Content -->
          <Button Text="Mid Button" Clicked="Button_OnClicked" /> 
        </StackLayout>

        <StackLayout VerticalOptions="End" BackgroundColor="Yellow"
                          RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=1}"
                          RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.90}"
                          RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.1}">

          <!-- Bottom Content -->
          <Button Text="Bottom Button" Clicked="Button_OnClicked" />
        </StackLayout>
</RelativeLayout>

Результаты:

Результаты Android

Ответ 4

Вы уже поняли это? Если нет, можно сделать несколько способов: Обратите внимание, что у меня такая же проблема, но это моя теория:

Итак, у вас может быть StackLayout, в котором вы заполняете его тремя "главными". Первый может быть абсолютным или относительным расположением (я пока не знаю разницы, что хорошо). Теоретически вы должны иметь возможность добавить элемент в абсолютный макет, а затем добавить элементы поверх первого элемента, поскольку абсолютный макет использует z-index, который работает как слои в Photoshop. Другими словами, сделайте так:

var topAbsoluteLayout = new AbsoluteLayout();

            topAbsoluteLayout.Children.Add(header, new Point(0, 0));
            topAbsoluteLayout.Children.Add(element1, new Point(x,y));
            topAbsoluteLayout.Children.Add(element2, new Point(x, y));

Затем вы должны сделать то же самое с нижним колонтитулом и не забудьте добавить topAbsoluteLayout в Childeren в StackLayout.

Я надеюсь, что это поможет вам

Ответ 5

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

public class CakeLayout : StackLayout
{
    public CakeLayout()
    {
        TopStack = new StackLayout // TOP stack
        {
            Orientation = StackOrientation.Horizontal,
            VerticalOptions = LayoutOptions.Start
        };

        CenterStack = new StackLayout // CENTER stack
        {
            VerticalOptions = LayoutOptions.CenterAndExpand
        };

        BottomStack = new StackLayout // BOTTOM stack
        {
            Orientation = StackOrientation.Horizontal,
            VerticalOptions = LayoutOptions.End
        };

        Children.Add(TopStack);
        Children.Add(CenterStack);
        Children.Add(BottomStack);
    }

    public StackLayout BottomStack { get; private set; }
    public StackLayout CenterStack { get; private set; }
    public StackLayout TopStack { get; private set; }
}

Затем, чтобы использовать это как страницу, например:

public class MyPage
{
    public MyPage()
    {
        CakeLayout cakeLayout = new CakeLayout();

        cakeLayout.TopStack.Children.Add(new Label { Text = "Hello Cake" });   
        cakeLayout.CenterStack.Children.Add(MyListView);
        cakeLayout.BottomStack.Children.Add(MyButton);

        // Assign the cake to the page
        this.Content = cakeLayout;
        ...
    }
...
}

Ответ 6

Я понял:

Я использовал StackLayout, который содержит три основных Childeren

 var stack = new StackLayout {
                Children =
                    {

                        _header,
                        _grid,
                        _footer,

                    }
            };

И тогда вы должны добавить заголовок как AbsoluteLayout и не забудьте использовать:

 {
    AbsoluteLayout.SetLayoutFlags(_imageYouWantToUse, AbsoluteLayoutFlags.PositionProportional);
    AbsoluteLayout.SetLayoutBounds(_imageYouWantToUse, new Rectangle(x, y, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));
_headerAbsLayout.Children.Add(_imageYouWantToUse);
    }

И для основной сетки или основного содержимого вы должны использовать сетку внутри StackLayout, так что вы уверены, что макет вертикальный (ориентация - это правильный вариант для использования здесь).

И сделаем то же самое для нижнего колонтитула, и я догадываюсь, что вам хорошо идти