如何在.NET MAUI(Android)中实现Xamarin Grid的行等高行为?
MAUI Android实现Grid Star行等高(匹配Xamarin行为)
问题说明
Xamarin中使用GridUnitType.Star定义Grid行高时,所有Star行自动统一为最高行的高度;但.NET 8 MAUI Android平台默认行为改为按内容自适应分配Star行高,导致行高不一致。
解决方案
方法1:自定义Grid控件封装逻辑
封装一个自动同步Star行高的Grid,避免重复代码:
public class EqualStarGrid : Grid { protected override void OnSizeAllocated(double width, double height) { base.OnSizeAllocated(width, height); SyncStarRowsHeight(); } private void SyncStarRowsHeight() { double maxHeight = 0; // 遍历Star行,获取最高行高度 foreach (var row in RowDefinitions.Where(r => r.Height.GridUnitType == GridUnitType.Star)) { var rowHeight = GetRowHeight(row); if (rowHeight > maxHeight) { maxHeight = rowHeight; } } // 将所有Star行设为最大高度 foreach (var row in RowDefinitions.Where(r => r.Height.GridUnitType == GridUnitType.Star)) { row.Height = new GridLength(maxHeight, GridUnitType.Absolute); } } }
XAML中直接使用自定义控件:
<local:EqualStarGrid> <local:EqualStarGrid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </local:EqualStarGrid.RowDefinitions> <!-- 各行内容 --> </local:EqualStarGrid>
方法2:通过Loaded事件手动同步行高
在页面后台代码中处理Grid加载事件,统一Star行高度:
private void Grid_Loaded(object sender, EventArgs e) { var grid = sender as Grid; double maxHeight = 0; // 计算最高Star行高度 foreach (var row in grid.RowDefinitions.Where(r => r.Height.GridUnitType == GridUnitType.Star)) { var rowHeight = grid.GetRowHeight(row); if (rowHeight > maxHeight) { maxHeight = rowHeight; } } // 同步所有Star行高度 foreach (var row in grid.RowDefinitions.Where(r => r.Height.GridUnitType == GridUnitType.Star)) { row.Height = new GridLength(maxHeight, GridUnitType.Absolute); } }
XAML绑定Loaded事件:
<Grid Loaded="Grid_Loaded"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- 各行内容 --> </Grid>
方法3:修改Android平台渲染行为
在Android平台配置中强制启用Xamarin兼容的Star行逻辑:
// 放在Platforms/Android/MainApplication.cs的OnCreate方法内 Microsoft.Maui.Controls.Compatibility.Platform.Android.GridRenderer.OverrideStarRowBehavior = true;
内容的提问来源于stack exchange,提问作者Jack The Healer
相关产品推荐
相关产品推荐

