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>
解决方案
核心问题
原代码存在两个关键问题:
- 给DataGrid嵌套了额外的
ScrollViewer,但DataGrid本身自带滚动功能,外层容器会导致整个区域(包括按钮)一起滚动 - 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
相关产品推荐
相关产品推荐

