如何配置Grid第0行高度随内部内容自动调整?
解决Grid行高度随InfoBar显示/隐藏自动调整的问题
你的核心问题是Grid第0行未随InfoBar的显示/隐藏自动收缩,虽然已经将RowDefinition.Height设为Auto,但可能是以下几点导致的:
问题排查与修复步骤
确保InfoBar关闭时完全不占空间:
WinUI的InfoBar默认在IsOpen=false时会将Visibility设为Collapsed(完全移除空间),但如果绑定逻辑或自定义样式改变了这个行为,需要显式绑定Visibility来确保:<InfoBar IsOpen="{x:Bind ViewModel.ErrorA}" Visibility="{x:Bind ViewModel.ErrorA, Converter={StaticResource BooleanToVisibilityConverter}}" ... />(需在资源中添加
BooleanToVisibilityConverter,若没有可手动实现一个简单的布尔值转可见性的转换器)检查Margin绑定的影响:
你给InfoBar绑定了Margin属性,如果ErrorAMargin在ErrorA=false时仍保留上下边距,会导致Row0仍占用额外空间。建议在ViewModel中同步调整Margin:当ErrorA为false时,将ErrorAMargin的上下值设为0,或者直接移除Margin绑定,使用默认间距。替换StackPanel为Grid(可选更可靠方案):
StackPanel虽能自动调整高度,但Grid的行布局在处理动态显示元素时更稳定。将Row0的容器换成Grid,每个子元素占一行,行高设为Auto:<Grid Grid.Row="0"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- 顶部水平面板 --> <StackPanel Grid.Row="0" Orientation="Horizontal" Background="{ThemeResource SystemAccentColorLight3}" Height="60" Padding="3"> ........ </StackPanel> <!-- ErrorA提示栏 --> <InfoBar Grid.Row="1" IsOpen="{x:Bind ViewModel.ErrorA}" Foreground="red" IsIconVisible="True" IsClosable="True" Title="Issue Detected" Content="{x:Bind ViewModel.ErrorAContent}"/> <!-- ErrorB提示栏 --> <InfoBar Grid.Row="2" IsOpen="{x:Bind ViewModel.ErrorB}" Foreground="red" IsIconVisible="True" IsClosable="True" Title="Issue Detected" Content="{x:Bind ViewModel.ErrorBContent}"/> </Grid>
最终修改后的完整代码示例
<Grid Margin="{StaticResource NavigationViewPageContentMargin}" CornerRadius="8"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="10"/> <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- 替换原StackPanel为Grid,确保每个子元素的高度都能被正确计算 --> <Grid Grid.Row="0"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal" Background="{ThemeResource SystemAccentColorLight3}" Height="60" Padding="3"> ........ </StackPanel> <InfoBar Grid.Row="1" IsOpen="{x:Bind ViewModel.ErrorA}" Visibility="{x:Bind ViewModel.ErrorA, Converter={StaticResource BooleanToVisibilityConverter}}" Foreground="red" IsIconVisible="True" IsClosable="True" Title="Issue Detected" Content="{x:Bind ViewModel.ErrorAContent}"/> <InfoBar Grid.Row="2" IsOpen="{x:Bind ViewModel.ErrorB}" Visibility="{x:Bind ViewModel.ErrorB, Converter={StaticResource BooleanToVisibilityConverter}}" Foreground="red" IsIconVisible="True" IsClosable="True" Title="Issue Detected" Content="{x:Bind ViewModel.ErrorBContent}"/> </Grid> <Frame x:Name="NavigationFrame" Grid.Row="2" Background="{ThemeResource SystemAccentColorLight3}" Padding="3" CornerRadius="8"/> </Grid>
内容的提问来源于stack exchange,提问作者brainer33
相关产品推荐
相关产品推荐

