为GridViewColumnHeader添加样式后,GridView列无法调整宽度的问题
解决GridView自定义列头样式后无法调整列宽的问题
嘿,我太懂这个坑了!你自定义GridViewColumnHeader的样式后失去列宽调整功能,是因为默认模板里负责拖拽调整的Thumb控件(就是列头右侧那个不起眼的可拖拽小条)没有被包含在你的自定义模板里。WPF依赖这个名为PART_RightHeaderGripper的内置部件来处理列宽调整逻辑,没它就没法拖拽啦😅
修复方案
给你的自定义ControlTemplate补上这个Thumb控件就行,下面是修改后的完整样式代码:
<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="ListColumnHeaderStyle"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type GridViewColumnHeader}"> <Grid> <!-- 保留你原来的列头内容区域 --> <Border BorderThickness="0,0,0,1" BorderBrush="WhiteSmoke" Background="Transparent"> <TextBlock x:Name="ContentHeader" Text="{TemplateBinding Content}" Padding="5,5,5,0" Width="{TemplateBinding Width}" TextAlignment="Left" /> </Border> <!-- 必须添加的列宽调整Thumb,名称不能改! --> <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Margin="0,0,-1,0" Cursor="SizeWE" Style="{StaticResource GridViewColumnHeaderGripper}"/> </Grid> <!-- 可选:添加触发器,让拖拽条在鼠标悬停时显示,更友好 --> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="PART_RightHeaderGripper" Property="Visibility" Value="Visible"/> </Trigger> <Trigger Property="IsMouseOver" Value="False"> <Setter TargetName="PART_RightHeaderGripper" Property="Visibility" Value="Hidden"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="OverridesDefaultStyle" Value="True" /> <Setter Property="Foreground" Value="White" /> <Setter Property="FontFamily" Value="Segoe UI" /> <!-- 补全你原来截断的字体设置 --> <!-- 自定义拖拽条的样式,也可以用系统默认的 --> <Style x:Key="GridViewColumnHeaderGripper" TargetType="Thumb"> <Setter Property="Width" Value="8"/> <Setter Property="Background" Value="Transparent"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Thumb}"> <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </Style>
重点提醒
PART_RightHeaderGripper是WPF约定好的命名,绝对不能改,否则GridView识别不了这个拖拽部件。- 把原来的Border放到Grid容器里,再把Thumb放在右侧,这样拖拽区域就和列头内容不冲突了。
- 触发器是可选的,如果你希望拖拽条一直显示,直接去掉触发器就行。
- 我补全了你原来截断的
FontFamily属性,你可以换成自己需要的字体。
这样修改后,你的GridView列就能正常拖拽调整宽度啦!
内容的提问来源于stack exchange,提问作者josepainumkal
相关产品推荐
相关产品推荐

