WPF中动态设置DataGrid高度及Horizontal GridSplitter失效问题求助
解决你的WPF布局与DataGrid性能问题
问题1:DataGrid无固定高度加载缓慢/无限加载
问题出在你把DataGrid放在了StackPanel里,而且外层套了ScrollViewer。StackPanel会无限拉伸来容纳子元素,这直接废掉了DataGrid的EnableRowVirtualization——虚拟化的核心是控件有固定的视口高度,只渲染可见行。没有高度约束时,DataGrid会试图渲染所有行,数据多了自然卡到爆。
解决办法:
- 删掉包裹DataGrid的
StackPanel,直接把DataGrid放到Grid的第0行里,Grid的行高保持0.5*,这样DataGrid会自动继承所在行的高度,虚拟化也能正常工作。 - 去掉外层的
ScrollViewer,DataGrid自己带垂直滚动条,外层ScrollViewer会让整个Grid失去高度约束,完全没必要。
问题2:GridSplitter加载数据后失效
同样是外层ScrollViewer的锅——它让Grid可以无限滚动,GridSplitter需要父容器有固定尺寸才能正常调整行高。另外你的GridSplitter设置了Grid.Column="1",但你根本没定义Grid的列,这会导致它不在正确的位置,拖拽不了。
解决办法:
- 移除外层
ScrollViewer,让Grid的高度由窗口(或父容器)决定,给GridSplitter一个稳定的布局环境。 - 把GridSplitter的
Grid.Column="1"删掉(或者改成0),确保它在唯一的列上,这样拖拽时才能正确调整上下行的高度。
修正后的完整代码
<Grid> <Grid.RowDefinitions> <RowDefinition Height="0.5*" /> <RowDefinition Height="0.5*" /> </Grid.RowDefinitions> <GridSplitter Panel.ZIndex="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Top" Grid.Row="1" Height="2" Background="#c0c0c0" /> <DataGrid Margin="10" Name="EventLogsDataGrid" IsReadOnly="False" SelectionChanged="EventLogsDataGrid_OnSelectionChanged" AutoGenerateColumns="False" CanUserSortColumns="False" EnableColumnVirtualization="True" EnableRowVirtualization="True" ColumnWidth="*" IsSynchronizedWithCurrentItem="True" CanUserAddRows="False" CanUserResizeRows="True" VerticalAlignment="Stretch" CanUserDeleteRows="False" /> <StackPanel Grid.Row="1" Margin="5 0 0 0"> <Label Content="Description"/> </StackPanel> </Grid>
补充提示
- 一定要保留
EnableRowVirtualization和EnableColumnVirtualization,这俩是DataGrid处理大量数据的关键,能大幅降低内存占用和渲染时间。 - 如果真的需要整个页面滚动(不建议,因为DataGrid滚动更友好),可以用
DockPanel替代外层的ScrollViewer,或者直接让窗口的Content就是这个Grid,避免布局冲突。
内容的提问来源于stack exchange,提问作者user2819304
相关产品推荐
相关产品推荐

