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

Avalonia:如何根据其他行可见性调整Grid首行大小

问题原因

你遇到的核心问题是:仅隐藏行内控件(设置IsVisible)并不会让对应的RowDefinition释放布局空间,第1、2行的高度仍然会被保留,导致首行的*无法自动填满整个Grid的高度。

解决方案

需要同时控制RowDefinition的高度,当ToggleButton未选中时,将第1、2行的高度设为0,选中时恢复原有高度。以下是修改后的完整代码:

<Grid>
    <Grid.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis"/>
    </Grid.Resources>
    <Grid.RowDefinitions>
        <!-- 首行:始终占满剩余空间 -->
        <RowDefinition Height="*"/>
        <!-- 分割线行:根据Toggle状态切换高度 -->
        <RowDefinition>
            <RowDefinition.Style>
                <Style TargetType="RowDefinition">
                    <Setter Property="Height" Value="5"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName=ToggleButton}" Value="False">
                            <Setter Property="Height" Value="0"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </RowDefinition.Style>
        </RowDefinition>
        <!-- 底部面板行:根据Toggle状态切换高度 -->
        <RowDefinition>
            <RowDefinition.Style>
                <Style TargetType="RowDefinition">
                    <Setter Property="Height" Value="*"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName=ToggleButton}" Value="False">
                            <Setter Property="Height" Value="0"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </RowDefinition.Style>
        </RowDefinition>
    </Grid.RowDefinitions>

    <!-- 顶部面板 -->
    <Grid Grid.Row="0">
        <!-- 设置Stretch确保图片铺满容器 -->
        <Image Source="../Assets/Image01.png" Stretch="Fill"/>
    </Grid>

    <!-- 分割线:同步Toggle状态控制可见性 -->
    <GridSplitter Grid.Row="1" 
                  Visibility="{Binding IsChecked, ElementName=ToggleButton, Converter={StaticResource BoolToVis}}"/>

    <!-- 底部面板:同步Toggle状态控制可见性 -->
    <Grid Grid.Row="2" 
          Visibility="{Binding IsChecked, ElementName=ToggleButton, Converter={StaticResource BoolToVis}}">
        <Image Source="../Assets/Image02.png" Stretch="Fill"/>
    </Grid>

    <!-- 切换按钮 -->
    <ToggleButton x:Name="ToggleButton" VerticalAlignment="Top" HorizontalAlignment="Right" Content="切换面板"/>
</Grid>
关键修改点
  • 给第1、2行的RowDefinition添加Style触发器,绑定ToggleButton的IsChecked状态,未选中时将高度设为0
  • 将控件的IsVisible替换为Visibility(WPF标准用法),配合内置的BooleanToVisibilityConverter实现状态切换
  • 给Image添加Stretch="Fill",确保图片能铺满所在Grid容器

内容的提问来源于stack exchange,提问作者Geertie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:40:36