WPF DataGrid调整列宽时分隔线处鼠标指针未切换为SizeWE光标问题
场景1:鼠标悬停列分隔线光标不切换,但可正常拖拽调整列宽
- 优先排查项目内是否存在全局隐式
DataGridColumnHeader样式:即使你没有给当前DataGrid单独设置样式,项目中定义的无Key、TargetType为DataGridColumnHeader的样式如果没有指定Cursor属性,就会覆盖系统默认的光标规则,导致悬停时不显示双向箭头。可以手动给当前DataGrid补充列头样式强制指定光标:
<DataGrid> <DataGrid.ColumnHeaderStyle> <Style TargetType="DataGridColumnHeader"> <Setter Property="Cursor" Value="SizeWE"/> </Style> </DataGrid.ColumnHeaderStyle> <!-- 原有列定义 --> </DataGrid>
- 排查列头区域是否被上层透明控件拦截:如果有
IsHitTestVisible="True"的透明控件叠在DataGrid列头上,会拦截鼠标光标判定,但拖拽事件仍可透传,就会出现你遇到的现象。可以用Visual Studio自带的实时可视化树工具,悬停在列分隔线位置,查看当前命中的控件是否为DataGridColumnHeader即可定位问题。
场景2:添加自定义Button样式后完全无法调整列宽
你提供的代码中存在布局层级错误:DataGrid和ScrollViewer都被设置为Grid.Row="1",两个控件堆叠在同一个Grid单元格内,ScrollViewer默认背景透明,视觉上看不到,但会完全拦截下方DataGrid的所有鼠标操作,所以无法调整列宽。和你设置的Button样式没有直接关联,你可以验证:临时把ScrollViewer注释后,DataGrid的列宽调整功能就会恢复。
解决方法可以二选一:
- 调整ScrollViewer的行号,放到独立的Grid行,比如
Grid.Row="2",避免和DataGrid堆叠 - 把DataGrid移到ScrollViewer内部,同时承载原有的grid_content内容:
<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <StackPanel> <DataGrid> <!-- 原有列定义 --> </DataGrid> <Grid x:Name="grid_content" Height="Auto" Width="Auto"> <!-- 原有内容 --> </Grid> </StackPanel> </ScrollViewer>
如果调整布局后仍存在问题,再排查你的ModernButtonTheme样式是否存在作用域溢出:如果样式中错误设置了全局的控件命中测试、光标规则,或者继承了错误的基类样式,也可能影响到DataGrid的默认行为,可以临时删除Button的Style属性验证是否恢复。
内容的提问来源于stack exchange,提问作者ds600
相关产品推荐
相关产品推荐

