C# 如何将ScrollView中的可视元素HeightRequest绑定为与页面高度相等?

C# 如何将ScrollView中的可视元素HeightRequest绑定为与页面高度相等?,c#,xaml,xamarin,xamarin.forms,xamarin.essentials,C#,Xaml,Xamarin,Xamarin.forms,Xamarin.essentials,我试图将BoxView的高度设置为页面的高度(我使用Xamarin Essentials)。BoxView包含在StackLayout中,StackLayout包含在滚动视图中,如下所示: <ScrollView Orientation="Vertical"> <StackLayout> <BoxView HeightRequest="{Binding height}" x:Name="TestBox" BackgroundColor="Or

我试图将BoxView的高度设置为页面的高度(我使用Xamarin Essentials)。BoxView包含在StackLayout中,StackLayout包含在滚动视图中,如下所示:

<ScrollView Orientation="Vertical">
    <StackLayout>
        <BoxView HeightRequest="{Binding height}" x:Name="TestBox" BackgroundColor="Orange" />
        <BoxView BackgroundColor="Red" HeightRequest="200" />
    </StackLayout>
</ScrollView>
结果是:

我还尝试在设置高度后添加以下内容,但这也不起作用:

this.ForceLayout();
但是,如果我手动设置HeightRequest,我会得到我想要的结果(但是,这只适用于我的特定设备):



如果BoxView同时包含在ScrollView中,如何将BoxView的高度绑定到页面的高度?

使用x:reference绑定ScrollView父级(ContentPage的直接子级)的
Height
属性。这对我有用

<ScrollView x:Name="parentLayout">
    <StackLayout>
        <BoxView
            BackgroundColor="LightBlue"
            HeightRequest="{Binding Height, Source={x:Reference parentLayout}}"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
    </StackLayout>
</ScrollView>

iOS中的UI结果(空白是由于安全区域)


希望这能对你有所帮助。如果这不符合您的要求,请进行注释。

您没有在代码隐藏中设置
bindingContext
,因此
HeightRequest=“{Binding height}”
将不起作用

此外,请记住,应将高度定义为属性

public partial class MainPage : ContentPage
{

    public Double height { get; set; }

    public MainPage()
    {
        InitializeComponent();

        height = DeviceDisplay.MainDisplayInfo.Height / DeviceDisplay.MainDisplayInfo.Density;

        BindingContext = this;
    }
}

我做了一个测试,在添加bindingContext并将高度定义为一个属性之后,,您的代码工作得很好:)。

我知道这不是很直观,但这里有一些提示:阅读一些Microsoft文档中关于垂直选项和水平选项的信息,你不需要知道一个设备的高度来填充内容,如果你想的话,我可以发布一个答案。我认为如果没有定制版面(因为它的内部StackLayout),这是不可能实现的。但令我惊讶的是,将超级父级的高度绑定到
BoxView
HeightRequest
,成功了。检查我的答案,我已经在那里添加了代码。正如@RicardoDiasMorais所说的,你不需要设备的高度来填充Page@RicardoDiasMorais我不明白你的回答如何回答这个问题。垂直选项只有在没有滚动视图的情况下才有效。@RyanGaudion我没有发布任何消息,是的,但是如果滚动视图没有填满整个空间,你永远无法知道它是否完全填满,除非内容比设备高,这就是我认为是你的问题,你的描述不清楚,标题也没有意义,但你是对的,垂直和水平的选择不足以实现你想要的,Nikhileshwar anwser是实现的方式go@RicardoDiasMorais谢谢你的回复。我已经编辑了这个问题,我希望这能让它更清楚。如果没有,请您向我提供有关如何改进问题的更多信息。请您进一步解释您的答案,因为我不明白您为什么不能准确绑定到boxview?另外,我希望有更多的控制权。我想蓝色部分是页面的高度(你已经做到了)。但我也希望白色部分是你向下滚动时页面的高度。准确地说???。我已将scrollview的高度绑定到Boxview。由于scrollview填充页面,因此BoxView的HeightRequest等于页面高度。在使用空白的情况下,将内容包装在视图中,并将其HeightRequest绑定到scrollview的高度。我现在无法更新代码。稍后将更新。更新代码后,请发布git repo链接。此外,稍后我想将第一个框视图的高度设置为页面高度的三分之一,将第二个框视图的高度设置为页面的整个高度。我可以用你描述的方法来做这件事吗?你可以使用转换器将父母身高的一小部分设置为HeightRequest。谢谢-这解决了这个问题!另外,由于您在本网站享有很高的声誉,请您回顾一下我的原始问题。如果它需要改进,那么请你建议如何改进它,如果不需要,请你投票表决。非常感谢。
<ScrollView x:Name="parentLayout">
    <StackLayout>
        <BoxView
            BackgroundColor="LightBlue"
            HeightRequest="{Binding Height, Source={x:Reference parentLayout}}"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
        <Label
            Text="Below BoxView"/>
    </StackLayout>
</ScrollView>
public partial class MainPage : ContentPage
{

    public Double height { get; set; }

    public MainPage()
    {
        InitializeComponent();

        height = DeviceDisplay.MainDisplayInfo.Height / DeviceDisplay.MainDisplayInfo.Density;

        BindingContext = this;
    }
}