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
相关产品推荐
相关产品推荐

