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

WPF中ListView列标题无法调整大小的问题排查

问题

尝试启用ListView的列标题调整大小功能,但样式设置存在问题,无法看到拖拽调整的选项。移除相关库的使用后功能恢复正常。曾尝试设置<GridViewColumnHeader Content="Value" IsHitTestVisible="False"/>但无效,请问遗漏了什么?

样式资源

<Style x:Key="ListViewItem" TargetType="ListViewItem">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="#76b900"/>
        </Trigger>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="#76b900"/>
        </Trigger>
    </Style.Triggers>
</Style>
<Style x:Key="ListViewStyle" TargetType="{x:Type ListView}" >
    <Setter Property="ItemContainerStyle" Value="{StaticResource ListViewItem}"/>
</Style>

<Style x:Key="GridViewColumnHeaderStyle1" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                <Border BorderThickness="0,0,1,1" BorderBrush="Black" Background="Transparent">
                    <TextBlock x:Name="ContentHeader" Text="{TemplateBinding Content}" 
                               Padding="5,5,5,5" Width="{TemplateBinding Width}" TextAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Foreground" Value="#76b900" />
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="FontSize" Value="18" />
    <Setter Property="Padding" Value="40,40" />
</Style>

ListView XAML代码

<ListView  d:ItemsSource="{d:SampleData}" ItemsSource="{Binding PGroups}" SelectedItem="{Binding PGroupSelected}"
           Foreground="White" Background="#292929" FontSize="16" BorderThickness="0"
           Visibility="{Binding PGroupsVis}"  Style="{DynamicResource ListViewStyle}" 
           ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="False" 
           IsSynchronizedWithCurrentItem="True" >
    <ListView.View>
        <GridView ColumnHeaderContainerStyle="{StaticResource GridViewColumnHeaderStyle1}">
            <GridViewColumn Header="Group" DisplayMemberBinding="{Binding Name}" Width="220" ></GridViewColumn>
            <GridViewColumn Header="Test Level" DisplayMemberBinding="{Binding Level.Name}" Width="140"></GridViewColumn>
            <GridViewColumn Header="OverrideColumn" DisplayMemberBinding="{Binding OverrideColumn}" Width="140"></GridViewColumn>
            <GridViewColumn Header="Active" DisplayMemberBinding="{Binding IsActive}" Width="140"></GridViewColumn>
            <GridViewColumn Header="Remove">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button  ToolTip="Remove"
                                 Command="{Binding Path=DataContext.RemovePGroupCommand, 
                                 RelativeSource={RelativeSource AncestorType=ListView, 
                                                 Mode=FindAncestor}}" CommandParameter="{Binding}"
                                 VerticalAlignment="Center"
                                 HorizontalAlignment="Center" Style="{StaticResource SimpleButton}">
                            <Image Source="../Images/delete3.png" Width="25"
                                   Height="25" Visibility="{Binding ComboUsersVis}" ></Image>
                        </Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>
原因分析

你自定义的GridViewColumnHeaderStyle1完全重写了控件模板,默认模板中负责列宽拖拽调整的Thumb元素被移除了,这才是无法拖拽调整列宽的核心原因。之前设置IsHitTestVisible="False"完全不对症,因为问题根本不在这。

解决方案

需要在自定义的GridViewColumnHeader模板中添加用于拖拽调整的Thumb元素,并且绑定相关属性以触发列宽调整逻辑。修改后的GridViewColumnHeaderStyle1模板代码如下:

<Style x:Key="GridViewColumnHeaderStyle1" TargetType="{x:Type GridViewColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                <Grid>
                    <!-- 原有的列头内容容器 -->
                    <Border BorderThickness="0,0,1,1" BorderBrush="Black" Background="Transparent">
                        <TextBlock x:Name="ContentHeader" Text="{TemplateBinding Content}" 
                                   Padding="5,5,5,5" TextAlignment="Center" />
                    </Border>
                    <!-- 添加拖拽调整用的Thumb -->
                    <Thumb x:Name="PART_HeaderGripper" 
                           HorizontalAlignment="Right" 
                           Width="10" 
                           Background="Transparent"
                           Cursor="SizeWE"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Foreground" Value="#76b900" />
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="FontSize" Value="18" />
    <Setter Property="Padding" Value="40,40" />
</Style>

说明:

  • 添加的Thumb元素必须命名为PART_HeaderGripper,这是WPF内置的命名约定,ListView会识别这个元素并关联列宽调整的逻辑。
  • 设置HorizontalAlignment="Right"让它显示在列头右侧,Width="10"给拖拽区域留出足够的点击空间,Cursor="SizeWE"设置鼠标悬停时的样式提示用户可拖拽。
  • 移除了原TextBlock的Width="{TemplateBinding Width}",避免列宽被固定导致拖拽失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:35:43