如何以编程方式将 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,那么这将是棘手的。
我不知道它的优雅解决方案。目前为止我知道没有办法轻松搞定GridViewColumnHeader
object,会被样式化。
我的提议是注入控件而不是设置 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...") };
我正在使用这行代码以编程方式向我的 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,那么这将是棘手的。
我不知道它的优雅解决方案。目前为止我知道没有办法轻松搞定GridViewColumnHeader
object,会被样式化。
我的提议是注入控件而不是设置 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...") };