如何以编程方式将 ListView Column Header 属性 IsHitTestVisible 设置为 False?

How to set ListView Column Header Property IsHitTestVisible to False programatically?

我正在使用这行代码以编程方式向我的 ListView 添加列:

gridView.Columns.Add(New GridViewColumn With {.Header = myWorksheet.Cells(1, myVar).Value, .DisplayMemberBinding = New Binding(myWorksheet.Cells(1, myVar).Value)})

我想做的是将 HitTest 设置为 False,这样用户就无法调整添加的列的大小,我尝试在我的 XAML 中这样做,但没有成功:

<GridView.ColumnHeaderContainerStyle>
    <Style BasedOn="{StaticResource {x:Type GridViewColumnHeader}}" TargetType="{x:Type GridViewColumnHeader}">
        <Setter Property="IsHitTestVisible" Value="False"/>
    </Style>
</GridView.ColumnHeaderContainerStyle>

这可能需要 VB.Net 中的解决方案,因为 XAML 代码不适用于以编程方式创建的列?


添加了 C# 标签,因为我发现它可以转换为 VB.Net。

XAML 样式应用于在 XAML 中添加的所有列以及来自后面的代码。如果你想设置 IsHitTestVisible 不是所有的,而是只为某些列的 header,那么这将是棘手的。

我不知道它的优雅解决方案。目前为止我知道没有办法轻松搞定GridViewColumnHeaderobject,会被样式化。

我的提议是注入控件而不是设置 header 文本,例如TextBlock,它将遍历 parents 并将 GridViewColumnHeader.IsHitTestVisible 设置为 false。

public class TextBlockNoHit<ParentHitTestVisibleType> : TextBlock where ParentHitTestVisibleType: UIElement 
{
    public bool lsParentHitTestVisible { get; set; }
    public TextBlockNoHit()
    {
        Loaded += TextBlockNoHit_Loaded;
    }

    private void TextBlockNoHit_Loaded(object sender, RoutedEventArgs e)
    {
        Loaded -= TextBlockNoHit_Loaded;
                
        DependencyObject dpo = this;
        while(dpo!=null)
        {
            dpo = VisualTreeHelper.GetParent(dpo);
            if(dpo is ParentHitTestVisibleType gvch)
            {
                gvch.IsHitTestVisible = lsParentHitTestVisible;
            }
        }
    }
}

然后使用:

var col = new GridViewColumn() { Header = new TextBlockNoHit<GridViewColumnHeader>() { Text = "myWorksheet.Cells...", IsHitTestVisible = false, lsParentHitTestVisible = false}, DisplayMemberBinding = new Binding("myWorksheet.Cells...") };