You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:12:37