Xamarin:向Grid动态添加行时StackLayout尺寸不增长问题
问题产生原因
你遇到的布局问题是由错误的VerticalOptions属性配置导致的:
- ScrollView的核心逻辑是根据内部子元素的实际内容高度决定可滚动范围,你给ScrollView的直接子元素StackLayout设置了
VerticalOptions="FillAndExpand",会强制StackLayout的高度被限制为ScrollView的可视区域高度,不会随内部内容增长自动撑开。 - StackLayout内部的Grid同样设置了
VerticalOptions="FillAndExpand",会强制Grid的高度被限制为StackLayout分配的固定剩余高度,动态添加行时Grid的高度不会自动增长,就会出现内容溢出、外层布局不跟随变化的问题。
正确实现方式
只需要修改XAML中两个控件的VerticalOptions配置即可,不需要修改C#逻辑:
- 将
MainStack的VerticalOptions从FillAndExpand改为Start(也可以直接删除该属性,StackLayout默认的垂直布局行为就是Start),让StackLayout可以根据内部子控件的总高度自动调整自身尺寸。 - 将
myGrid的VerticalOptions从FillAndExpand改为Start(也可以直接删除该属性),让Grid动态添加行时可以自动撑开高度。
修改后的核心XAML片段如下:
<ScrollView x:Name="myScrollView" BackgroundColor="LightBlue" VerticalOptions="FillAndExpand"> <!-- 移除FillAndExpand,改为Start或直接省略该属性 --> <StackLayout x:Name="MainStack" BackgroundColor="YellowGreen" VerticalOptions="Start"> <Label Text="Start of StackLayout"></Label> <Button Text="Populate Grid" Clicked="Button_Clicked" x:Name="btnFill" BackgroundColor="Black" TextColor="White"></Button> <!-- 移除FillAndExpand,改为Start或直接省略该属性 --> <Grid x:Name="myGrid" BackgroundColor="Yellow" VerticalOptions="Start"></Grid> <Label Text="Bottom of StackLayout"></Label> </StackLayout> </ScrollView>
修改后运行点击按钮,Grid高度会随新增行自动增长,外层StackLayout也会同步调整高度,ScrollView可正常滚动显示全部内容。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

