【问题标题】:How to set ListView Column Header Property IsHitTestVisible to False programatically?如何以编程方式将 ListView 列标题属性 IsHitTestVisible 设置为 False?
【发布时间】: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。

【问题讨论】:

    标签: c# wpf 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 解决方案,但它们都没有阻止我调整列的大小,相信我我试过了,然后我研究了如何以编程方式进行,因为我认为没有办法它以这种方式工作。我会试试你的解决方案:),谢谢!
    猜你喜欢
    • 2018-08-15
    • 2018-03-19
    • 2021-06-22
    • 2023-01-03
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2012-08-22
    相关资源
    最近更新 更多