如何结合GridSplitter与DataGrid并保留垂直滚动条?拖动后灰色区域排查
布局问题排查:拖动GridSplitter后MainGrid出现空白区域,需保证DataGrid垂直滚动条始终可用
初始布局显示正常,但拖动GridSplitter后,DataGrid的垂直滚动条虽保留,但归属MainGrid的灰色空白区域出现。需修复该问题并确保DataGrid始终具备垂直滚动条。
原始XAML结构
<Grid x:Name="MainGrid"> <Grid.RowDefinitions> <RowDefinition Height="auto" MaxHeight="60"/> <RowDefinition /> </Grid.RowDefinitions> <Grid x:Name="Grd_Header" Grid.Row ="0" MaxHeight="60"> <Grid.RowDefinitions> <RowDefinition Height="0"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="10"></RowDefinition> </Grid.RowDefinitions> </Grid> <Grid x:Name="Grd_Data" Grid.Row="1"> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="10"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <Grid x:Name="Grd_Act" Grid.Row="0" VerticalAlignment="Stretch"> <Grid.RowDefinitions> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="*"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <DataGrid Name="..." Grid.Row="1" Grid.Column="0"> <telerik:RadBusyIndicator Grid.Row="0" Grid.RowSpan="2" .../> </Grid> <GridSplitter Grid.Row="1" Height="3" Background="black" HorizontalAlignment="Stretch" /> <Grid x:Name="Grd_plan" Grid.Row="2"> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="*" MinHeight="50"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <TextBlock Text="planned..." Grid.Row="0" Grid.Column="0"/> <DataGrid Grid.Row="1" ...> <telerik:RadBusyIndicator Grid.RowSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BusyContent="Loading pallets" IsBusy="{Binding IsLoadingGepandeMatrijsPalletten}" Grid.ColumnSpan="2"/> </Grid> </Grid> </Grid>
全局DataGrid样式
<Style TargetType="DataGrid"> <Setter Property="HorizontalAlignment" Value="Stretch"/> <Setter Property="VerticalAlignment" Value="Stretch"/> <Setter Property="AutoGenerateColumns" Value="False"/> <Setter Property="IsReadOnly" Value="True"/> <Setter Property="ColumnWidth" Value="Auto"/> <Setter Property="FontSize" Value="12"/> </Style>
问题原因分析
- GridSplitter布局错误:GridSplitter位于固定高度的Row(
Height="10"),且未明确设置调整行为,拖动时会导致上下行高度计算异常,引发MainGrid布局溢出。 - 可调整行配置不当:Grd_Act所在的Row为
Height="auto",无法通过GridSplitter调整高度,且内容高度可能超出容器限制,导致整体布局超出MainGrid范围。 - 冗余行定义:Grd_Act内部存在多余的RowDefinition(第三个
*行),浪费空间且可能干扰高度计算。
修复方案
1. 调整Grd_Data的RowDefinitions与GridSplitter属性
将Grd_Act所在行改为可调整的*高度并设置最小高度,同时明确GridSplitter的调整行为:
<Grid x:Name="Grd_Data" Grid.Row="1"> <Grid.RowDefinitions> <!-- 改为*高度并设置最小高度,允许GridSplitter调整 --> <RowDefinition Height="*" MinHeight="100"/> <!-- GridSplitter所在行高度与自身高度一致 --> <RowDefinition Height="3"/> <RowDefinition Height="*" MinHeight="100"/> </Grid.RowDefinitions> <!-- 明确GridSplitter的调整方向和行为 --> <GridSplitter Grid.Row="1" Height="3" Background="black" HorizontalAlignment="Stretch" ResizeDirection="Rows" ResizeBehavior="PreviousAndNext"/> <!-- 其他内容保持不变 --> </Grid>
2. 清理Grd_Act内部冗余行定义
移除多余的RowDefinition,让DataGrid占满可用空间:
<Grid x:Name="Grd_Act" Grid.Row="0" VerticalAlignment="Stretch"> <Grid.RowDefinitions> <RowDefinition Height="30"/> <!-- 仅保留一个*行,让DataGrid占满剩余空间 --> <RowDefinition Height="*"/> </Grid.RowDefinitions> <DataGrid Name="..." Grid.Row="1" Grid.Column="0" VerticalScrollBarVisibility="Auto"/> <telerik:RadBusyIndicator Grid.Row="0" Grid.RowSpan="2" .../> </Grid>
3. 确保DataGrid滚动条显式启用
在DataGrid上显式设置VerticalScrollBarVisibility="Auto"(虽为默认值,但显式设置可避免样式冲突),同时保证其父容器的高度被正确约束(使用*高度而非auto)。
4. 验证MainGrid布局约束
确保MainGrid的VerticalAlignment="Stretch"(默认值),且父容器未设置固定高度或溢出隐藏,保证MainGrid占满可用空间。
修改后效果
拖动GridSplitter时,上下两行可正常调整高度,不会出现MainGrid空白区域;DataGrid始终在约束高度内显示,垂直滚动条会在内容超出时自动出现。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

