【问题标题】:How to add borders to WPF ListView in code如何在代码中为 WPF ListView 添加边框
【发布时间】:2014-10-01 13:00:03
【问题描述】:

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

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

现在,我定义一个 GridViewColumn,设置标题、宽度和 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

【问题讨论】:

  • 删除所有内容并使用正确的 XAML。
  • 我无法使用 XAML,因为我必须动态创建此控件,该控件会呈现到 XPS 文件中。

标签: wpf listview gridview wpf-controls


【解决方案1】:

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

我了解您想要 Winforms 中的 ListView Grid 之类的东西。如果您使用 XAML 代码,在 WPF 中可以轻松实现。即使在后面的代码中,您也始终可以从 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;

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

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

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

【讨论】:

  • 嘿,非常感谢您提到这个方法。我现在无法在我的 GridView 中获得水平网格线。我还需要得到垂直线来完成外观。我检查了 GridViewColumn,它只有标题的样式,而不是单个单元格的样式。你知道如何通过代码获取每一列的竖线吗?
  • @NikhilNehriya 我的答案中的代码只是呈现水平线,实际上它是某种带有(假)边框的hack/play。然而对于垂直线,做这样的事情很难实现。几乎不可能有一个优雅的解决方法来解决这个问题。你可以试试GridViewColumn.CellTemplate。更改CellTemplate 似乎是唯一的方法,但即使更改该模板,结果仍然不是很完美。问题是单元格之间总是有一个空格(某种单元格间距)。
  • 是的,我在玩 CellTemplate,但结果并不理想。想知道你是否知道更好的解决方法。 WPF 世界缺少这样的基本自定义,这有点奇怪。无论如何,由于您的回答,我现在有了水平线。会做到的。
【解决方案2】:

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

【讨论】:

  • 谢谢,但就我而言,我使用的是 ListView,而您提供的链接使用了 Grid。我有我需要的一切例外我错过了网格线。此外,ShowGridLines 属性适用于 Grid 类而不是 ListView 类:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多