如何以编程方式将 ListView 列标题属性 IsHitTestVisible 设置为 False?

Posted

技术标签:

【中文标题】如何以编程方式将 ListView 列标题属性 IsHitTestVisible 设置为 False?【英文标题】:How to set ListView Column Header Property IsHitTestVisible to False programatically? 【发布时间】:2022-01-18 18:14:37 【问题描述】:

我正在使用这行代码以编程方式向我的 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。

【问题讨论】:

【参考方案1】:

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

我不知道优雅的解决方案。到目前为止,我知道没有办法获得简单的GridViewColumnHeader 对象,它将被设置样式。

我的提议是注入控件而不是设置标题文本,例如TextBlock,它将遍历父母并将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...") ;

【讨论】:

对不起C#而不是VB,我希望你能得到一个转换。 IDK,我在我的 ListView 中尝试了几种 XAML 解决方案,但它们都没有阻止我调整列的大小,相信我我试过了,然后我研究了如何以编程方式进行,因为我认为没有办法它以这种方式工作。我会试试你的解决方案:),谢谢!

以上是关于如何以编程方式将 ListView 列标题属性 IsHitTestVisible 设置为 False?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中以编程方式设置listview高度

按钮按下以编程方式将新行添加到 ListView,如何?

如何在 BaseAdapter 中以编程方式将 ListView 项设置为检查

如何以编程方式设置 Kendo UI 网格列宽

如何以编程方式将渲染设置为PrimeFaces列?

以编程方式滚动到 Android ListView 中的特定位置