.net WPF ListView中的网格线
如何在WPFListView控件中显示网格线?试试这些资源-它们都提供了类似的简单解决方案,我在过去成功地使用过.net WPF ListView中的网格线,.net,wpf,.net,Wpf,如何在WPFListView控件中显示网格线?试试这些资源-它们都提供了类似的简单解决方案,我在过去成功地使用过 更新:链接现在指向网页的存档副本,因为网页已经关闭了一段时间实现自定义GridViewRowPresenter并在ArrangeOverride方法中绘制垂直线 protected override Size ArrangeOverride(Size arrangeSize) { var size = base.ArrangeOverride(ar
更新:链接现在指向网页的存档副本,因为网页已经关闭了一段时间实现自定义GridViewRowPresenter并在ArrangeOverride方法中绘制垂直线
protected override Size ArrangeOverride(Size arrangeSize)
{
var size = base.ArrangeOverride(arrangeSize);
var children = Children.ToList();
EnsureLines(children.Count);
for (var i = 0; i < _lines.Count; i++)
{
var child = children[i];
var x = child.TransformToAncestor(this).Transform(new Point(child.ActualWidth, 0)).X + child.Margin.Right;
var rect = new Rect(x, -Margin.Top, 1, size.Height + Margin.Top + Margin.Bottom);
var line = _lines[i];
line.Measure(rect.Size);
line.Arrange(rect);
}
return size;
}
受保护的替代尺寸ArrangeOverride(尺寸arrangeSize)
{
变量大小=基本.ArrangeOverride(arrangeSize);
var children=children.ToList();
EnsureLines(children.Count);
对于(变量i=0;i<\u lines.Count;i++)
{
var child=childs[i];
var x=child.TransformToAncestor(this).Transform(新点(child.ActualWidth,0)).x+child.Margin.Right;
var rect=新的rect(x,-Margin.Top,1,size.Height+Margin.Top+Margin.Bottom);
变量行=_行[i];
测线(直线尺寸);
行。排列(rect);
}
返回大小;
}
然后将其用于ListViewItem模板
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Margin" Value="2,0,0,0"/>
<Setter Property="Padding" Value="0,2"/>
<Setter Property="BorderBrush" Value="LightGray"/>
<Setter Property="BorderThickness" Value="0,0,0,1"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
<GridLines:GridViewRowPresenterWithGridLines
Columns="{TemplateBinding GridView.ColumnCollection}"
Margin="{TemplateBinding Padding}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
迟交答案,但可能对某人有所帮助: 首先创建celltemplate边框的样式,如下所示:
<Style x:Key="BorderStyle" TargetType="{x:Type Border}">
<Setter Property="BorderThickness" Value="0,0,1,0"></Setter>
<Setter Property="BorderBrush" Value="Black"></Setter>
<Setter Property="Margin" Value="0,0,-7,0"></Setter>
</Style>
<DataTemplate x:Key="_SomeColumnCellTemplate">
<Border Style="{StaticResource BorderStyle}">
<DockPanel Margin="5,0,0,0">
<TextBlock Text="{Binding Name}" Margin="5,0,0,0"/>
</DockPanel>
</Border>
</DataTemplate>
<Style x:Key="_ItemContainerStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
然后按如下方式设置itemcontainer样式:
<Style x:Key="BorderStyle" TargetType="{x:Type Border}">
<Setter Property="BorderThickness" Value="0,0,1,0"></Setter>
<Setter Property="BorderBrush" Value="Black"></Setter>
<Setter Property="Margin" Value="0,0,-7,0"></Setter>
</Style>
<DataTemplate x:Key="_SomeColumnCellTemplate">
<Border Style="{StaticResource BorderStyle}">
<DockPanel Margin="5,0,0,0">
<TextBlock Text="{Binding Name}" Margin="5,0,0,0"/>
</DockPanel>
</Border>
</DataTemplate>
<Style x:Key="_ItemContainerStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
最后引用listview项容器样式资源,如下所示(我在代码中跳过了绑定listview项源代码):
详细说明我的-(必须在右边空白处使用-8)
结果:
我很高兴你解决了这个问题,但我真正希望的是像
GridLines=“Vertical”
这样的东西。你不会相信,但我也希望如此。我花了半天的时间来寻找并找出解决方案,而不是花5秒钟来写GridLines=“Vertical”。对于GridLines=“Vertical”这样简单的东西,我只花了+1。另一个Microsoft WPF失败。对于第二个链接中的解决方案,最后一行缺少底线。一个小小的调整是将单元格的边框设置为“1,0,0,0”(仅左侧),将最后一列的边框设置为“1,0,1,0”(或“1,0”)的左侧和右侧,然后还将边框笔刷+边框厚度添加到ListView.ItemContainer样式为“0,0,0,1”-即单元格负责垂直线,行(ItemContainer)负责水平线。我将添加一个带有代码示例的答案。