C# 将Xamarin表单中的布局粘贴到底部

C# 将Xamarin表单中的布局粘贴到底部,c#,layout,xamarin.forms,absolutelayout,C#,Layout,Xamarin.forms,Absolutelayout,我正在用Xamarin表单制作一个应用程序,但在将布局粘贴到设备底部时遇到了一些问题。我以为一个绝对的布局会起作用,但我不能理解它是如何工作的。所以我做了一个相对论,我用我想填充的元素填充了它,但现在我似乎无法让它一直粘在设备的底部 下面是一个截图,希望能让事情更清楚一点。 我有一个stacklayout,我用headerlayout和contentlayout填充它。但是,如果我只是将footerlayout添加到stacklayout,它将不会被粘贴到页面底部,而是(逻辑上)刚好位于前一个子

我正在用Xamarin表单制作一个应用程序,但在将布局粘贴到设备底部时遇到了一些问题。我以为一个绝对的布局会起作用,但我不能理解它是如何工作的。所以我做了一个相对论,我用我想填充的元素填充了它,但现在我似乎无法让它一直粘在设备的底部

下面是一个截图,希望能让事情更清楚一点。 我有一个stacklayout,我用headerlayout和contentlayout填充它。但是,如果我只是将footerlayout添加到stacklayout,它将不会被粘贴到页面底部,而是(逻辑上)刚好位于前一个子页面的后面。现在我认为一个绝对的布局可以做到这一点,但我似乎无法掌握它的功能、布局标志和边界。有人能帮我吗


您可以使用垂直选项将布局发送到底部

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

你明白了吗? 如果没有,有几种方法可以实现这一点: 请注意,我自己也有同样的问题,但这是我的理论:

这样您就可以有一个StackLayout,在其中填充三个“main children”。第一种可能是绝对或相对布局(我还不太清楚两者之间的区别)。理论上,您应该能够向绝对布局添加元素,然后在第一个元素的顶部添加元素,因为绝对布局使用z索引,其工作原理类似于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添加到StackLayout中的Children

我希望这能帮到你

我想起来了:

我使用了StackLayout,它包含三个主要的子元素

 var stack = new StackLayout {
                Children =
                    {

                        _header,
                        _grid,
                        _footer,

                    }
            };
然后,您应该将标题添加为绝对布局,并记住使用:

 {
    AbsoluteLayout.SetLayoutFlags(_imageYouWantToUse, AbsoluteLayoutFlags.PositionProportional);
    AbsoluteLayout.SetLayoutBounds(_imageYouWantToUse, new Rectangle(x, y, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));
_headerAbsLayout.Children.Add(_imageYouWantToUse);
    }
对于主网格或主内容,您应该在StackLayout中使用网格,以便确保布局是垂直的(方向,这里使用的是正确的方向)

对页脚也做同样的事情,我想你可以走了


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

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

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

确保最多有一个子级具有
展开
选项,以获得最佳性能。

下面是一个用于自动执行此操作的类。通过将类扩展为具有可滚动的中心部分(因此,如果太长,则不会与底部重叠),可以添加大量内容,等等

然后将其用作页面,例如:

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;
        ...
    }
...
}

在相对较长的时间内,我通过定义高度和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>

结果:

就这么简单

AbsoluteLayout.SetLayoutFlags(footer, AbsoluteLayoutFlags.YProportional | AbsoluteLayoutFlags.WidthProportional);
AbsoluteLayout.SetLayoutBounds(footer, new Rectangle(0, 1, 1, AbsoluteLayout.AutoSize));
absoluteLayout.Children.Add(footer);

发现如果内容不够大,这确实会使中间堆栈布局居中,但这不是我想要的,将其设置为StartAndExpand将使其位于顶部堆栈布局下方的顶部,而底部堆栈布局仍将保持在屏幕底部。Does
VerticalOptions=“End”
始终将控件放在底部,还是与文化有关?我希望即使键盘显示,底部布局也始终保持在底部,但它当前会将其向上推。无论如何,为了防止这种功能,这种方法也适用于Xamarin.Forms 4.6项目。在我的例子中,底部控件保持粘性,中间控件包含ScrollView中的可滚动内容。。。。。。。如何占领中部的所有区域?
AbsoluteLayout.SetLayoutFlags(footer, AbsoluteLayoutFlags.YProportional | AbsoluteLayoutFlags.WidthProportional);
AbsoluteLayout.SetLayoutBounds(footer, new Rectangle(0, 1, 1, AbsoluteLayout.AutoSize));
absoluteLayout.Children.Add(footer);