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

WPF DataGrid添加滚动条并固定操作按钮问题求助

问题需求

我在这个问题上已经耗费了大量时间,希望实现DataGrid内显示滚动条,让用户能够查看DataGrid中的所有记录,同时确保Add、Edit、Delete等操作按钮固定在可点击位置,无需滚动整个窗口即可操作。

原代码

<TabItem Header="Revit Links" Width="100">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="58*"/>
                <ColumnDefinition Width="78*"/>
                <ColumnDefinition Width="733*"/>
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <Label Content="Revit Links:" Height="Auto" Margin="10,35,10,0"
                        Grid.ColumnSpan="3" Grid.RowSpan="2"/>
        <ScrollViewer Grid.Row="2" Grid.ColumnSpan="3" VerticalScrollBarVisibility="Visible">
                <DataGrid x:Name="dgRevitLinks2" ItemsSource="{Binding RevitLinkedFiles}" AutoGenerateColumns="False"
          IsReadOnly="True" Margin="10"  HorizontalScrollBarVisibility="Auto"
      VerticalScrollBarVisibility="Auto" CanUserAddRows="False" CanUserDeleteRows="False" SelectionMode="Extended" SelectionUnit="FullRow"
                                  SelectedItem="{Binding SelRevitLinkedFile}"
                                  CanUserReorderColumns="False" CanUserResizeRows="False" CanUserResizeColumns="False"
                                  CellStyle="{StaticResource CenteredDataGridCell}"
                                  Background="White" RowHeaderWidth="0" BorderBrush="#FFACACAC">


                    <DataGrid.Resources>
                        <Style TargetType="DataGridRow">
                            <EventSetter Event="MouseDoubleClick" Handler="dgRevitLinks_MouseDoubleClick"/>
                        </Style>
                    </DataGrid.Resources>
                    <DataGrid.Columns>

                        <DataGridTextColumn Header="Link Name" Binding="{Binding Path=RevitLinkType.Name}">
                            <DataGridTextColumn.CellStyle>
                                <Style TargetType="DataGridCell">
                                    <Setter Property="ToolTip" Value="{Binding Path=OriginalFilePath}" />
                                </Style>
                            </DataGridTextColumn.CellStyle>
                        </DataGridTextColumn>

                        <DataGridTextColumn Header="New Path" Binding="{Binding Path=NewFilePath}" Width="*">
                            <DataGridTextColumn.ElementStyle>
                                <Style>
                                    <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                                    <Setter Property="TextBlock.TextAlignment" Value="Left"/>
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                        <DataGridTextColumn Header="Option Rule" Binding="{Binding Path=Rules}" Width="Auto">
                            <DataGridTextColumn.ElementStyle>
                                <Style>
                                    <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                                    <Setter Property="TextBlock.TextAlignment" Value="Left"/>
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                    </DataGrid.Columns>

                    <DataGrid.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Add" Command="{Binding AddRevitLinkCommand}"/>
                            <MenuItem Header="Edit" Command="{Binding EditRevitLinkCommand}"/>
                            <MenuItem Header="Delete" Command="{Binding DeleteRevitLinkCommand}"/>
                            <MenuItem Header="Save" Command="{Binding SaveRevitLinkCommand}"/>
                        </ContextMenu>
                    </DataGrid.ContextMenu>
                </DataGrid>
        </ScrollViewer>

        <StackPanel Margin="0,0,10,10" Orientation="Horizontal" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" Grid.Row="3" Grid.RowSpan="2">

                    <Button Content="Add" Command="{Binding AddRevitLinkCommand}" ToolTip ="Adds a Revit Linked File Option"/>
                    <Button Content="Edit" Command="{Binding EditRevitLinkCommand}" ToolTip ="Edits a Revit Linked File Option"/>
                    <Button Content="Delete" Command="{Binding DeleteRevitLinkCommand}" ToolTip ="Deletes a Revit Linked File Option"/>
                    <Button Content="Save" Command="{Binding SaveRevitLinkCommand}" ToolTip ="Saves changes to active project"/>
                </StackPanel>

                <TextBlock FontWeight="Bold" Margin="10,16,10,7"
                            VerticalAlignment="Center" TextWrapping="Wrap" Grid.ColumnSpan="3" Height="26" ToolTip="A minimum of 1 Sheet Set Required of Lot Job Exports.">
                    <Run>RVT files must be replaced with .RVT Files</Run>
                </TextBlock>
        </Grid>
</TabItem>

解决方案

核心问题

原代码存在两个关键问题:

  1. 给DataGrid嵌套了额外的ScrollViewer,但DataGrid本身自带滚动功能,外层容器会导致整个区域(包括按钮)一起滚动
  2. Grid的所有行高设为Auto,DataGrid会随内容无限拉伸,无法触发自身的滚动机制

修复后代码

<TabItem Header="Revit Links" Width="100">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="58*"/>
            <ColumnDefinition Width="78*"/>
            <ColumnDefinition Width="733*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/> <!-- 标题行,自适应高度 -->
            <RowDefinition Height="*"/>     <!-- DataGrid占剩余全部空间 -->
            <RowDefinition Height="Auto"/>  <!-- 提示文本行 -->
            <RowDefinition Height="Auto"/>  <!-- 操作按钮行 -->
        </Grid.RowDefinitions>

        <Label Content="Revit Links:" Height="Auto" Margin="10,35,10,0"
               Grid.ColumnSpan="3"/>
        
        <!-- 移除外层ScrollViewer,使用DataGrid内置滚动 -->
        <DataGrid x:Name="dgRevitLinks2" ItemsSource="{Binding RevitLinkedFiles}" AutoGenerateColumns="False"
                  IsReadOnly="True" Margin="10" HorizontalScrollBarVisibility="Auto"
                  VerticalScrollBarVisibility="Visible" CanUserAddRows="False" CanUserDeleteRows="False" 
                  SelectionMode="Extended" SelectionUnit="FullRow"
                  SelectedItem="{Binding SelRevitLinkedFile}"
                  CanUserReorderColumns="False" CanUserResizeRows="False" CanUserResizeColumns="False"
                  CellStyle="{StaticResource CenteredDataGridCell}"
                  Background="White" RowHeaderWidth="0" BorderBrush="#FFACACAC"
                  Grid.Row="1" Grid.ColumnSpan="3">

            <DataGrid.Resources>
                <Style TargetType="DataGridRow">
                    <EventSetter Event="MouseDoubleClick" Handler="dgRevitLinks_MouseDoubleClick"/>
                </Style>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Link Name" Binding="{Binding Path=RevitLinkType.Name}">
                    <DataGridTextColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="ToolTip" Value="{Binding Path=OriginalFilePath}" />
                        </Style>
                    </DataGridTextColumn.CellStyle>
                </DataGridTextColumn>

                <DataGridTextColumn Header="New Path" Binding="{Binding Path=NewFilePath}" Width="*">
                    <DataGridTextColumn.ElementStyle>
                        <Style>
                            <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                            <Setter Property="TextBlock.TextAlignment" Value="Left"/>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Option Rule" Binding="{Binding Path=Rules}" Width="Auto">
                    <DataGridTextColumn.ElementStyle>
                        <Style>
                            <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                            <Setter Property="TextBlock.TextAlignment" Value="Left"/>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>

            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Add" Command="{Binding AddRevitLinkCommand}"/>
                    <MenuItem Header="Edit" Command="{Binding EditRevitLinkCommand}"/>
                    <MenuItem Header="Delete" Command="{Binding DeleteRevitLinkCommand}"/>
                    <MenuItem Header="Save" Command="{Binding SaveRevitLinkCommand}"/>
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>

        <StackPanel Margin="0,0,10,10" Orientation="Horizontal" Grid.Column="2" 
                    HorizontalAlignment="Right" VerticalAlignment="Bottom" Grid.Row="3">
            <Button Content="Add" Command="{Binding AddRevitLinkCommand}" 
                    ToolTip="Adds a Revit Linked File Option"/>
            <Button Content="Edit" Command="{Binding EditRevitLinkCommand}" 
                    ToolTip="Edits a Revit Linked File Option"/>
            <Button Content="Delete" Command="{Binding DeleteRevitLinkCommand}" 
                    ToolTip="Deletes a Revit Linked File Option"/>
            <Button Content="Save" Command="{Binding SaveRevitLinkCommand}" 
                    ToolTip="Saves changes to active project"/>
        </StackPanel>

        <TextBlock FontWeight="Bold" Margin="10,16,10,7"
                   VerticalAlignment="Center" TextWrapping="Wrap" Grid.ColumnSpan="3" 
                   Height="26" ToolTip="A minimum of 1 Sheet Set Required of Lot Job Exports."
                   Grid.Row="2">
            <Run>RVT files must be replaced with .RVT Files</Run>
        </TextBlock>
    </Grid>
</TabItem>

关键修改说明

  • 移除外层ScrollViewer:DataGrid自带滚动逻辑,外层容器会破坏独立滚动的效果,直接使用DataGrid自身的VerticalScrollBarVisibility属性控制滚动条显示
  • 调整Grid行布局:将DataGrid所在行的高度设为*,让它占据TabItem内除标题、按钮、提示文本外的所有可用空间,当内容超出这个区域时自动触发滚动
  • 固定按钮位置:将操作按钮放在独立的Auto高度行内,确保它始终显示在TabItem底部,不会随DataGrid内容滚动
  • 强制显示垂直滚动条:设置VerticalScrollBarVisibility="Visible",让用户直观知道可以滚动查看更多内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:48:09