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

如何结合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>

问题原因分析

  1. GridSplitter布局错误:GridSplitter位于固定高度的Row(Height="10"),且未明确设置调整行为,拖动时会导致上下行高度计算异常,引发MainGrid布局溢出。
  2. 可调整行配置不当:Grd_Act所在的Row为Height="auto",无法通过GridSplitter调整高度,且内容高度可能超出容器限制,导致整体布局超出MainGrid范围。
  3. 冗余行定义: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:44:51