如何在代码中向WPF ListView添加边框

时间:2014-10-01 13:00:03

标签: wpf listview gridview wpf-controls

我在代码中创建了一个带有GridView的ListView。

ListView gridList = new ListView();
GridView gridListView = new GridView ();
gridList.View = gridListView;

现在,我定义了一个GridViewColumn,设置了header,width和bindingPath。一切都很好,数据显示出来。

GridViewColumn listColumn = new GridViewColumn();
listColumn.Header = "Some Header";
listColumn.Width = 100.0;
listColumn.DisplayMemeberBinding = new Binding("Name");
gridListView.Columns.Add(listColumn);

但此ListView的显示屏上没有显示边框/网格线。如何通过代码添加边框?

有人在这里描述了我的确切问题,但没有提到好的解决方案 http://social.msdn.microsoft.com/Forums/en-US/fa4fa8e0-81fe-487a-8763-590062d29c06/wpf-listview-gridview-row-border?forum=wpf

2 个答案:

答案 0 :(得分:1)

WPF编程中的逻辑与您在winforms中所做的完全不同。应始终使用XAML(尽可能多)设置与UI相关的所有内容。 WPF库本身有许多部分主要用于XAML,尽管总有一个等效的代码隐藏。然而,当使用代码隐藏时,这可能是尴尬和非直观(以及直接)。

我知道你想要像Winforms中的ListView Grid一样。在WPF中,如果使用XAML代码,可以轻松实现。即使在代码背后,您也可以始终从XAML字符串构建StyleTemplate(在XamlReader的帮助下)。这种方法适用于复杂场景,但在这种情况下,我有另一种方法(根本不使用XAML解析器)。这个技巧确实使得网格足够好(并且最多只能用于简化的权衡):

//we need an instance of Style to set to ListView.ItemContainerStyle
var style = new Style(typeof(ListViewItem));
//set the bottom border thickness to 1
var setter = new Setter(Control.BorderThickness, new Thickness(0,0,0,1));
style.Setters.Add(setter);
//set the border brush
var borderBrush = new LinearGradientBrush { StartPoint = new Point(0,0),
                                            EndPoint = new Point(1,0)};
var gradStop = new GradientStop(Colors.Transparent, 0.001);
    borderBrush.GradientStops.Add(gradStop);
gradStop = new GradientStop(Colors.Green, 0.001);
    borderBrush.GradientStops.Add(gradStop);
gradStop = new GradientStop(Colors.Green, 0.999);
    borderBrush.GradientStops.Add(gradStop);
gradStop = new GradientStop(Colors.Transparent, 0.999);
    borderBrush.GradientStops.Add(gradStop);
setter = new Setter(Control.BorderBrush, borderBrush);
style.Setters.Add(setter);

yourListView.ItemContainerStyle = style;

请注意,每个Border的默认内部ListViewItem都有一个约2的硬编码CornerRadius,因此只需将底部BorderBrush设置为实心画笔,例如因为Brushes.Green将在底部边框的两端显示一条向上的卷曲线。你可以自己试试。如果这个结果是可以接受的,代码可以更短更简单(因为你不必定义GradientBrush来截断2个卷曲的结尾),如下所示:

setter = new Setter(Control.BorderBrush, Brushes.Green);
style.Setters.Add(setter);

如果行为仍然不是您想要的。您应该尝试我提到的关于使用XamlReader解析XAML字符串并获取代码隐藏中所需内容的实例的方法。 (你可以自己搜索,很容易得到一些结果)。

答案 1 :(得分:0)

我建议你看看这个link,它包含一个在代码隐藏中创建的动态GridView,它对你的特定情况很有用。对于您提供的代码示例,您没有添加ShowGridLines属性。