.net WPF ListView 中的网格线
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3138628/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Grid lines in WPF ListView
提问by atul gupta
How can we show grid lines in the WPFListView control?
我们如何在 WPFListView 控件中显示网格线?
采纳答案by Noldorin
Try these resources - they both offer similar straightforward solutions, which I've used successfully in the past.
试试这些资源——它们都提供了类似的直接解决方案,我过去曾成功地使用过这些解决方案。
WPF ListView Vertical Lines (Horizontal as Bonus
How Do I Set Up Grid Lines for my ListView?
Update:links now point to archived copies of web pages, since the pages have been down for some time
更新:链接现在指向网页的存档副本,因为这些页面已经关闭了一段时间
回答by Bulat
Implement custom GridViewRowPresenter and draw vertical lines in ArrangeOverride method.
实现自定义 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;
}
Then use this for ListViewItem template.
然后将此用于 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>
回答by David Refaeli
Elaborating on my comment to selected answer- (had to use -8 on the right side margin)
详细说明我对所选答案的评论- (必须在右侧边距上使用 -8)
<ListView HorizontalContentAlignment="Stretch" BorderBrush="Gray" BorderThickness="1" ItemsSource="{Binding FileList}" SelectedItem="{Binding FileSelected, Mode=TwoWay}" >
<ListView.Resources>
<DataTemplate x:Key="VerTemplate">
<Border BorderBrush="Gray" BorderThickness="1,0,0,0" Margin="-6,-2,-8,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding SFVer}" HorizontalAlignment="Center" TextAlignment="Center" />
</StackPanel>
</Border>
</DataTemplate>
<DataTemplate x:Key="FOTemplate">
<Border BorderBrush="Gray" BorderThickness="1,0,0,0" Margin="-6,-2,-8,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding SFFO}" HorizontalAlignment="Center" TextAlignment="Center" />
</StackPanel>
</Border>
</DataTemplate>
<!-- etc. -->
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="BorderBrush" Value="Gray"></Setter>
<Setter Property="BorderThickness" Value="0,0,0,1"></Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridView.Columns>
<GridViewColumn CellTemplate="{StaticResource VerTemplate}"/>
<GridViewColumn CellTemplate="{StaticResource FOTemplate}"/>
<!-- etc. -->
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
回答by Ahmad
Late answer but it might help someone:
迟到的答案,但它可能会帮助某人:
First create a style for the celltemplate border as follows:
首先为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>
and then set your itemcontainer style as follows:
然后按如下方式设置您的 itemcontainer 样式:
<Style x:Key="_ItemContainerStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>
and finally reference your listview item container style resource as follows (i skipped binding to the listview items source in this code):
最后按如下方式引用您的列表视图项容器样式资源(我在此代码中跳过了与列表视图项源的绑定):
<ListView ItemContainerStyle="{StaticResource _ListViewItemContainerStyle}">
<ListView.View>
<GridView>
<GridViewColumn Header="SomeName" CellTemplate="{StaticResource _SomeColumnCellTemplate}"/>
</GridView>
</ListView.View>
</ListView>


