通过代码为GridViewCell指定列添加边框无效的问题求助
解决WPF GridViewCell边框设置无效果的问题
我明白你遇到的困扰了——同样是通过CellStyle设置依赖属性,Background能正常生效,但BorderThickness和BorderBrush完全没反应,这确实挺让人摸不着头脑的。
问题根源
WPF的GridViewCell默认样式的可视化树里,并没有包含Border元素。它的默认模板通常直接使用ContentPresenter来展示内容,所以你设置的BorderThickness和BorderBrush没有对应的可视化元素去承载这些属性,自然看不到效果。而Background属性是直接作用于GridViewCell本身的背景区域,所以能正常显示。
解决方案:自定义GridViewCell的ControlTemplate
要让边框生效,我们需要给GridViewCell的样式添加一个包含Border元素的自定义模板,并把Border的相关属性绑定到GridViewCell的依赖属性上。这样设置Cell的边框属性时,就能传递给模板里的Border元素了。
以下是修改后的代码:
if (eligibleProperties.Contains(column.Header.ToString())) { // 创建GridViewCell的样式 Style cellStyle = new Style(typeof(GridViewCell)); // 构建自定义ControlTemplate ControlTemplate cellTemplate = new ControlTemplate(typeof(GridViewCell)); // 创建Border元素作为模板的根 FrameworkElementFactory borderElement = new FrameworkElementFactory(typeof(Border)); // 绑定Border的BorderThickness到GridViewCell的对应属性 borderElement.SetBinding(Border.BorderThicknessProperty, new Binding("BorderThickness") { RelativeSource = RelativeSource.TemplatedParent }); // 绑定Border的BorderBrush到GridViewCell的对应属性 borderElement.SetBinding(Border.BorderBrushProperty, new Binding("BorderBrush") { RelativeSource = RelativeSource.TemplatedParent }); // 绑定Border的Background到GridViewCell的Background(保持背景生效) borderElement.SetBinding(Border.BackgroundProperty, new Binding("Background") { RelativeSource = RelativeSource.TemplatedParent }); // 添加ContentPresenter用于显示单元格内容 FrameworkElementFactory contentPresenter = new FrameworkElementFactory(typeof(ContentPresenter)); contentPresenter.SetValue(ContentPresenter.HorizontalAlignmentProperty, HorizontalAlignment.Left); contentPresenter.SetValue(ContentPresenter.VerticalAlignmentProperty, VerticalAlignment.Center); borderElement.AppendChild(contentPresenter); // 将Border设为模板的可视化树 cellTemplate.VisualTree = borderElement; // 把模板添加到样式的Setter中 cellStyle.Setters.Add(new Setter(GridViewCell.TemplateProperty, cellTemplate)); // 设置边框的具体值 cellStyle.Setters.Add(new Setter(GridViewCell.BorderThicknessProperty, new Thickness(7))); cellStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, Brushes.Black)); // 如果你需要设置背景,也可以继续添加 // cellStyle.Setters.Add(new Setter(GridViewCell.BackgroundProperty, Brushes.LightGray)); // 应用样式到列 column.CellStyle = cellStyle; }
补充说明
如果你习惯用XAML来定义样式,也可以把这段模板逻辑写到XAML资源里,然后在代码中引用,这样可读性会更好。不过上面的纯C#代码已经能解决你的问题啦。
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

