WPF Grid添加边框的两种方法

最近项目中使用到了Grid表格,居然要加边框,查了一下,grid原生居然是不支持实线边框的。。

最终我还是实现了效果,

看看吧:

左边是直接写的每行一个border,每列写一个border,这样在行列比较少的时候还行,如果多了,那不惨了,项目中我就这样写的了,反正能实现效果了。。。

右边是使用附加属性,动态添加的border,还行吧,有不少缺点,比如不能处理单元格合并的问题。先不管了,反正我也用不到哈哈。

下面就看看代码吧:

新建一个GridProperties类,用来 放附加属性的定义:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace wpfcore
{public class GridProperties{public static bool GetShowBorder(DependencyObject obj){return (bool)obj.GetValue(ShowBorderProperty);}public static void SetShowBorder(DependencyObject obj, bool value){obj.SetValue(ShowBorderProperty, value);}public static readonly DependencyProperty ShowBorderProperty =DependencyProperty.RegisterAttached("ShowBorder", typeof(bool), typeof(Grid), new PropertyMetadata(false,OnShowBorderChanged));private static void OnShowBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){if (!(d is Grid grid)) return;grid.Loaded += OnLoaded;}private static void OnLoaded(object sender, RoutedEventArgs e){if (!(sender is Grid grid)) return;var rowCount = grid.RowDefinitions.Count;var columnCount = grid.ColumnDefinitions.Count;var thickness = new Thickness(1);var bottomThickness = new Thickness(0,0,0,1);var rightThickness = new Thickness(0,0,1,0);var headerBack = new SolidColorBrush(Color.FromArgb(255, 129, 133, 145));for (int i = 0; i < rowCount; i++){Border border = new Border(){BorderBrush = Brushes.Black,BorderThickness = i == 0 ? thickness : bottomThickness,Background = i == 0 ? headerBack : Brushes.Transparent,};border.SetValue(Panel.ZIndexProperty, -1000);border.SetValue(Grid.RowProperty, i);border.SetValue(Grid.ColumnProperty, 0);border.SetValue(Grid.ColumnSpanProperty, columnCount);grid.Children.Add(border);}for (int i = 0; i < columnCount; i++){Border border = new Border(){BorderBrush = Brushes.Black,BorderThickness = i == 0 ? thickness : rightThickness,Background = Brushes.Transparent,};border.SetValue(Panel.ZIndexProperty, -1000);border.SetValue(Grid.RowProperty, 0);border.SetValue(Grid.ColumnProperty, i);border.SetValue(Grid.RowSpanProperty, rowCount);grid.Children.Add(border);}grid.Loaded -= OnLoaded;}}
}

然后在MainWindow的测试代码:

<Window x:Class="wpfcore.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:wpfcore"mc:Ignorable="d"Background="LightBlue"UseLayoutRounding="True"Title="MainWindow" Width="820" Height="340"><Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><StackPanel Margin="30" VerticalAlignment="Center" HorizontalAlignment="Center"><TextBlock Text="直接写 Border的方式添加" FontSize="18" Margin="10" Foreground="Green" HorizontalAlignment="Center"/><Grid Width="300" Height="150" ><Grid.Resources><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="VerticalAlignment" Value="Center"/><Setter Property="FontSize" Value="16"/><Setter Property="FontFamily" Value="微软雅黑"/>
</Style><Style TargetType="Border" ><Setter Property="BorderBrush" Value="Black"/><Setter Property="BorderThickness" Value="1"/>
</Style></Grid.Resources><Grid.ColumnDefinitions><ColumnDefinition Width="1.5*"/><ColumnDefinition Width="1*"/><ColumnDefinition Width="2*"/><ColumnDefinition Width="1*"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" Background="#818591"/><Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4" BorderThickness="0 0 0 1"/><Border Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="4" BorderThickness="0 0 0 1"/><Border Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="4" BorderThickness="0 0 0 1"/><Border Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" /><Border Grid.Row="0" Grid.Column="1" Grid.RowSpan="4" BorderThickness="0 0 1 0"/><Border Grid.Row="0" Grid.Column="2" Grid.RowSpan="4" BorderThickness="0 0 1 0"/><Border Grid.Row="0" Grid.Column="3" Grid.RowSpan="4" BorderThickness="0 0 1 0"/><TextBlock Grid.Row="0" Grid.Column="0" Text="姓名"/><TextBlock Grid.Row="0" Grid.Column="1" Text="年龄"/><TextBlock Grid.Row="0" Grid.Column="2" Text="兴趣爱好"/><TextBlock Grid.Row="0" Grid.Column="3" Text="性别"/><TextBlock Grid.Row="1" Grid.Column="0" Text="WPF UI"/><TextBlock Grid.Row="1" Grid.Column="1" Text="3M"/><TextBlock Grid.Row="1" Grid.Column="2" Text="分享代码"/><TextBlock Grid.Row="1" Grid.Column="3" Text="汉子"/></Grid></StackPanel><StackPanel Grid.Column="1" Margin="30" VerticalAlignment="Center" HorizontalAlignment="Center"><TextBlock Text="使用附加属性添加" FontSize="18" Margin="10" Foreground="Green" HorizontalAlignment="Center"/><Grid Width="300" Height="150" local:GridProperties.ShowBorder="True"><Grid.Resources><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="VerticalAlignment" Value="Center"/><Setter Property="FontSize" Value="16"/><Setter Property="FontFamily" Value="微软雅黑"/>
</Style><Style TargetType="Border"><Setter Property="BorderBrush" Value="Black"/><Setter Property="BorderThickness" Value="1"/>
</Style></Grid.Resources><Grid.ColumnDefinitions><ColumnDefinition Width="1.5*"/><ColumnDefinition Width="1*"/><ColumnDefinition Width="2*"/><ColumnDefinition Width="1*"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /><RowDefinition /></Grid.RowDefinitions><TextBlock Grid.Row="0" Grid.Column="0" Text="姓名"/><TextBlock Grid.Row="0" Grid.Column="1" Text="年龄"/><TextBlock Grid.Row="0" Grid.Column="2" Text="兴趣爱好"/><TextBlock Grid.Row="0" Grid.Column="3" Text="性别"/><TextBlock Grid.Row="1" Grid.Column="0" Text="WPF UI"/><TextBlock Grid.Row="1" Grid.Column="1" Text="3M"/><TextBlock Grid.Row="1" Grid.Column="2" Text="分享代码"/><TextBlock Grid.Row="1" Grid.Column="3" Text="汉子"/></Grid></StackPanel>        </Grid>
</Window>

以上xaml就能实现视频中的效果啦

如果喜欢,点个赞呗~您的点赞是我更新的动力~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当初互联网大佬给的几块钱“羊毛”,现在又要我们加倍还回去!

全世界只有3.14 % 的人关注了数据与算法之美对于上班族来说&#xff0c;春节早就过去了&#xff0c;今天已经是上班的第N天了。不知道大家在春节七天有没有走进电影院呢&#xff1f;在春节档期的八部电影各有各的特色&#xff0c;数据汪一一看完之后真是爽歪歪&#xff01;但是…

在 dotnet runtime 的容器中安装 dotnet global tool

在 dotnet runtime 的容器中安装 dotnet global toolIntro.NET Core 从 2.1 开始支持 Global tool, 借助 global tool 我们可以通过命令行来实现很多功能&#xff0c;微软提供的一系列的 dotnet 诊断工具也都提供了 global tool&#xff0c;我们可以通过 global tool 比较方便的…

Asymptote 学习记录(2):例子阅读

学习编程的一个有效方式是去读别人写的代码.我学习了这里的代码.代码虽多,但是简单.代码如下(稍微做了修改): import settings; pdfviewer"/usr/bin/okular"; outformat"pdf"; size(400); texpreamble("\usepackage{CJK}\AtBeginDocument{\begin{CJK}…

如何启发孩子的数学思维?你想要的答案或许在这!

▲数据汪特别推荐点击上图进入玩酷屋记得寒假时&#xff0c;超模君七岁小表弟来问了我一道题目&#xff1a;下面线段有多少条&#xff1f;首先我问了他什么是线段&#xff1f;他说&#xff1a;两端有端点&#xff0c;不可以伸长的直线。AB就是线段。我慢慢引导&#xff0c;假如…

.NET Core 服务在 ARM64 服务器中的部署

Linux 服务器 CPU 架构主要可分为&#xff1a;X86_64/AMD64、ARM64/AARCH64 两大类&#xff0c;大多情况使用的都是基于 AMD64 CPU 架构的服务器。但随着国产操作系统、CPU 等自主生态打造的应用产品得到越来越多的用户认可和应用&#xff0c;如&#xff1a;华为鲲鹏、统信 UOS…

php 读取onedrive文件夹,oneindex

oneindexOnedrive Directory Index功能&#xff1a;不用服务器空间&#xff0c;不走服务器流量&#xff0c;直接列onedrive目录&#xff0c;文件直链下载。demochange log:18-03-29: 更新直链获取机制、缓存机制&#xff0c;避免频繁访问的token失效18-03-29: 解决非英文编码问…

50种奇妙装置玩法,将STEM教育一网打尽

▲数据汪特别推荐点击上图进入玩酷屋致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分&#xff0c;因为它涉及到了多种学科&#xff1a;要搭建得稳固——这是工程学&#xff1b;…

ubuntu php7.4,在Ubuntu 18.04/19.04/16.04版本上安装PHP 7.4的简单方法

以下介绍安装PHP 7.4的方法非常的简单&#xff0c;适用于Ubuntu 18.04/19.04/16.04版本上&#xff0c;所安装的版本是PHP 7.4.0 RC1&#xff0c;只需要添加PHP ppa存储库并运行相关命令即可完成安装。一、添加PHP ppa存储库我们将添加ppa:ondrej/php PPA存储库&#xff0c;它具…

通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...

在上一篇文章里&#xff0c;我们通过注入sentinel component到apigateway实现了对下游服务的保护&#xff0c;不过受限于目前变更component需要人工的重新注入配置以及重启应用更新component等等原因&#xff0c;对于真实的环境运维稍有难度&#xff0c;最近我根据sentinel-gol…

NASA成立寻找外星人小组,三全水饺回应猪瘟,微波炉+葡萄=爆炸,94年故宫首次晚间开放,这就是今天的大新闻!...

元宵节刚刚过完汤圆也吃了好几碗是时候来回忆下发生了什么下面是今天的大新闻报&#xff01;故宫网站崩了&#xff0c;被众多人“围攻”&#xff01; &#xff08;搜狐新闻&#xff09;此前&#xff0c;故宫94年来首开夜场”的消息刷屏了&#xff01;故宫将在正月十五、十六开夜…

wpf 可以取消的单选checkbox

利用radioButton的groupName分组互斥。。再解决radiobutton的取消选择的问题。给radiobutton加了一个像checkbox的样式 2个方式&#xff1a; 效果图 第一种usecontrol&#xff1a; xaml&#xff1a; View Code <RadioButton x:Class"GEMS.Windows.Controls.UserContro…

表格高亮

引用&#xff1a;http://blog.163.com/ms8712126/blog/static/1899099120122934023200/ //js实现隔行变色window.οnlοadfunction(){var otaldocument.getElementById("otable");for(var i0; i<otal.rows.length; i){ if(i%20){ otal.rows[i].className"e…

大数据人工智能时代,这个行业终于爆发了!

全世界只有3.14 % 的人关注了数据与算法之美这个冬天的程序员可谓是受到了心理和生理上的双重折磨&#xff0c;不仅天气冷&#xff0c;寒冬还见了鬼一样的笼罩着互联网&#xff01;正如老话所说&#xff0c;哪有稳定的工作&#xff0c;只有稳定的能力。这个冬天上午还在改bug下…

弃码而去

题图来自溪源2017年拍摄的照片。弃码而去1那是2015年的一天。下午5点40&#xff0c;我收拾完手头上的工作&#xff0c;准备关机回家时&#xff0c;qq上突然弹出的窗口吸引了我的注意。“源哥&#xff0c;我能跟你聊一下么&#xff1f;”我点开一看&#xff0c;发现给我发消息的…

config.php开启redis,微擎如何开启redis,redis开启方法详解

资源来源网络&#xff0c;如果需要授权&#xff0c;请大家更换源码&#xff0c;模块仅供学习&#xff0c;如需商用请购买正版授权&#xff0c;本栏目不提供技术服务&#xff0c;积分不够请签到&#xff0c;或者会员中心投稿源码一、使用5G云宝塔定制版的很多问微信怎么开启redi…

对不起,你被裁了

全世界只有3.14 % 的人关注了数据与算法之美在这互联网高速发展的时代新词层出不穷不过说到造词能力中国肯定是当仁不让的就连裁员这件事都能玩出花来今天数据汪就给大家普普及一下那些关于“裁员”的黑话美团美团外卖&#xff0c;裁员真快不久前&#xff0c;有美团员工在脉脉上…

c#爬虫-使用ChromeDriver 所见即所得

问题最近在做爬虫的时候发现很多网页都是浏览器看得见&#xff0c;但是源文件是看不到的&#xff0c;也就是所谓的异步加载。这时候如果我们需要那些异步内容&#xff0c;要么是了解他的规则&#xff0c;进行条件的组合进而再次进行http请求&#xff0c;得到数据&#xff1b;这…

使用Ext.grid.Panel显示远程数据

使用Ext.grid.Panel显示远程数据 对于Ext.grid.Panel而言&#xff0c;它只是负责显示Store数组中心的数据&#xff0c;至于Store保存的数据到底是浏览器本地数据&#xff0c;还是远程服务器的数据&#xff0c;Ext.grid.Panel并不关心。因此&#xff0c;使用Ext.grid.Panel显示远…

4-8岁那些最难的数学概念,美国老师用一套绘本让孩子秒懂

▲数据汪特别推荐点击上图进入玩酷屋在美国&#xff0c;有不少数学故事类的绘本&#xff0c;小木今天推荐的这套《Math is categorical》就经常被美国老师用于课堂的教学&#xff0c;亚马逊的评价也是接近5星的好评。下面这个5星评价就是来自于一位美国老师&#xff0c;她就说学…

WPF 读取Docx文件并显示(附下载链接)

在wpf中直接显示Docx文件 &#xff0c;直接看看效果吧&#xff1a;下面直接看代码&#xff0c;添加主要有两个类&#xff1a;DocxReader类&#xff1a;using System; using System.IO; using System.IO.Packaging; using System.Xml;namespace WpfEmbeddedDocx {class DocxRead…