如何以编程方式将 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?的主要内容,如果未能解决你的问题,请参考以下文章