一、添加GridOptions类:

public class GridOptions{//暂时不处理实时显示的事情#region 显示边框信息public static readonly DependencyProperty ShowBorderProperty =DependencyProperty.RegisterAttached("ShowBorder", typeof(bool), typeof(GridOptions), new PropertyMetadata(OnShowBorderChanged));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 void OnShowBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var grid = d as Grid;if ((bool)e.OldValue)grid.Loaded -= (s, arg) => { };else{grid.Loaded += new RoutedEventHandler(GridLoaded);}}#endregion#region 线宽信息public static readonly DependencyProperty LineThicknessProperty =DependencyProperty.RegisterAttached("LineThickness", typeof(double), typeof(GridOptions),new PropertyMetadata(1d, OnGridLineThicknessChanged));public static double GetLineThickness(DependencyObject obj){return (double)obj.GetValue(LineThicknessProperty);}public static void SetLineThickness(DependencyObject obj, double value){obj.SetValue(LineThicknessProperty, value);}public static void OnGridLineThicknessChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){}#endregionpublic static readonly DependencyProperty LineBrushProperty =DependencyProperty.RegisterAttached("LineBrush", typeof(Brush), typeof(GridOptions),new PropertyMetadata(Brushes.Gray, OnGridLineBrushChanged));#region 线画刷问题public static Brush GetLineBrush(DependencyObject obj){var brush = (Brush)obj.GetValue(LineBrushProperty);return brush ?? Brushes.LightGray;}public static void SetLineBrush(DependencyObject obj, Brush value){obj.SetValue(LineBrushProperty, value);}public static void OnGridLineBrushChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){}#endregionprivate static void GridLoaded(object sender, RoutedEventArgs e){#region 思路/** 1、覆盖所有单元格都要包围上边框。* 2、边框线不能存在重复。每个单元格绘制【右下】部分,主体绘制右上部分*/#endregionvar grid = sender as Grid;var rowCount = Math.Max(1, grid.RowDefinitions.Count);var columnCount = Math.Max(1, grid.ColumnDefinitions.Count);#region 初始化标准数组int[,] flagArray = new int[rowCount, columnCount];#endregionvar controls = grid.Children;var count = controls.Count;var settingThickness = GetLineThickness(grid);var borderBrush = GetLineBrush(grid);for (int i = 0; i < count; i++){var item = controls[i] as FrameworkElement;var row = Grid.GetRow((item));var column = Grid.GetColumn(item);var rowSpan = Grid.GetRowSpan(item);var columnSpan = Grid.GetColumnSpan(item);for (int rowTemp = 0; rowTemp < rowSpan; rowTemp++){for (int colTemp = 0; colTemp < columnSpan; colTemp++){flagArray[rowTemp + row, colTemp + column] = 1;}}var border = CreateBorder(row, column, rowSpan, columnSpan, settingThickness);border.BorderBrush = borderBrush;grid.Children.RemoveAt(i);border.Child = item;grid.Children.Insert(i, border);}#region 整理为填充单元格for (int i = 0; i < rowCount; i++){for (int k = 0; k < columnCount; k++){if (flagArray[i, k] == 0){var border = CreateBorder(i, k, 1, 1, settingThickness);border.BorderBrush = borderBrush;grid.Children.Add(border);}}}#endregion}private static Border CreateBorder(int row, int column, int rowSpan, int columnSpan, double thickness){var useThickness = new Thickness(0, 0, thickness, thickness);if (row == 0)useThickness.Top = thickness;if (column == 0)useThickness.Left = thickness;var border = new Border(){BorderThickness = useThickness,};Grid.SetRow(border, row);Grid.SetColumn(border, column);Grid.SetRowSpan(border, rowSpan);Grid.SetColumnSpan(border, columnSpan);return border;}}

xml代码:

<Grid  x:Name="mesureGrid" Margin="50" ScrollViewer.CanContentScroll="True" local:GridOptions.ShowBorder="True" Grid.Column="1" Grid.Row="1"Background="White" ><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition/><RowDefinition/><RowDefinition/><RowDefinition/><RowDefinition/></Grid.RowDefinitions><TextBlock Text="1234" HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid>

效果如下:

说一下我自己的总结:

这个方法只适用于Grid划分整齐的。如3行3列。4行4列。如果不是以上列举类型。就在每个独立的Grid里应用l ocal:GridOptions.ShowBorder="True"

<Grid  x:Name="mesureGrid" Margin="50" ScrollViewer.CanContentScroll="True" local:GridOptions.ShowBorder="True" Grid.Column="1" Grid.Row="1" Background="White" >

WPF 自定义绘制显示Grid网格线相关推荐

  1. WPF学习笔记(7):DataGrid中数字自定义格式显示

    WPF学习笔记(7):DataGrid中数字自定义格式显示 原文:WPF学习笔记(7):DataGrid中数字自定义格式显示 DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1 ...

  2. WPF自定义LED风格数字显示控件

    WPF自定义LED风格数字显示控件 原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP1119 ...

  3. wpf研究之道-grid控件

    想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...

  4. WPF 自定义CheckBox样式

    引: WPF 自定义CheckBox样式 - 一叶知秋,知寒冬 - 博客园 Checkbox基本样式 下面的样式包含了CheckBox三种状态的显示,这里CheckBox的三种状态是使用图片代替的.当 ...

  5. WPF 自定义DataGrid控件样式

    WPF 自定义DataGrid控件样式 样式一: 样式代码: <!--DataGrid样式--><Style TargetType="DataGrid">& ...

  6. WPF自定义空心文字

    原文:WPF自定义空心文字 首先创建一个自定义控件,继承自FrameworkElement,"Generic.xaml"中可以不添加样式. 要自定义空心文字,要用到绘制格式化文本F ...

  7. WPF 自定义 MessageBox (相对完善版 v1.0.0.6)

    基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当你不得不弹出一个消息框通知用户消息时(虽然很不建议在程序中频繁 ...

  8. 【C#】wpf自定义calendar日期选择控件的样式

    原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...

  9. WPF自定义日期时间控件

    WPF自定义日期时间控件 一.需求分析 二.功能实现 一.需求分析 在工作中遇到的项目中,大部分软件是处于全屏运行状态,这时候就需要在软件的界面上加上日期时间那些,方便用户查看当前时间. 二.功能实现 ...

最新文章

  1. mysql 5.7 安装错误提示总结
  2. SAP QM Quality Notification的凭证流
  3. ffmpeg源码分析——av_register_all
  4. [hiho1159] Poker
  5. 《java入门第一季》之面向对象(包概述)
  6. 联想ghost重装系统_一键ghost,详细教您使用一键ghost怎么重装win7系统
  7. 强化学习《基于策略 - Policy Grident》
  8. 大数据系列1-规划安排
  9. Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
  10. python学习笔记:操作Excle
  11. 大厂Sketch组件库源文件
  12. 基于三维WebGL技术的公安三维项目
  13. 小智-微直播 使用教程
  14. flutter中的常见色值设置
  15. IOS error:Images.xcassets: error: ERROR: Each TDDistiller instance can be distilled only one time!
  16. andriod TV 获取已连接蓝牙遥控器电池电量总结
  17. “数据结构基础”系列网络课程主页
  18. 软件行业职位及相关缩写
  19. 数学——行向量和列向量
  20. 华为S系列交换机修改密码不成功

热门文章

  1. 阿里云 ACP 认证,分享下经验心得
  2. Linux执行命令常见的英语语句
  3. LSB顺序+随机隐写和提取(matlab)
  4. Tensorflow
  5. Motor Back-drive电机反驱
  6. 如何判断选择专业数字功放芯片
  7. Qt 数字报阅读器 图文版
  8. DirectX11 骷髅头示例Demo
  9. ThinkPHP5部署项目问题1
  10. 计算机光驱参数,光驱价格参数简介【图文】