WPF 自定义绘制显示Grid网格线
一、添加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网格线相关推荐
- WPF学习笔记(7):DataGrid中数字自定义格式显示
WPF学习笔记(7):DataGrid中数字自定义格式显示 原文:WPF学习笔记(7):DataGrid中数字自定义格式显示 DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1 ...
- WPF自定义LED风格数字显示控件
WPF自定义LED风格数字显示控件 原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP1119 ...
- wpf研究之道-grid控件
想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...
- WPF 自定义CheckBox样式
引: WPF 自定义CheckBox样式 - 一叶知秋,知寒冬 - 博客园 Checkbox基本样式 下面的样式包含了CheckBox三种状态的显示,这里CheckBox的三种状态是使用图片代替的.当 ...
- WPF 自定义DataGrid控件样式
WPF 自定义DataGrid控件样式 样式一: 样式代码: <!--DataGrid样式--><Style TargetType="DataGrid">& ...
- WPF自定义空心文字
原文:WPF自定义空心文字 首先创建一个自定义控件,继承自FrameworkElement,"Generic.xaml"中可以不添加样式. 要自定义空心文字,要用到绘制格式化文本F ...
- WPF 自定义 MessageBox (相对完善版 v1.0.0.6)
基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当你不得不弹出一个消息框通知用户消息时(虽然很不建议在程序中频繁 ...
- 【C#】wpf自定义calendar日期选择控件的样式
原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...
- WPF自定义日期时间控件
WPF自定义日期时间控件 一.需求分析 二.功能实现 一.需求分析 在工作中遇到的项目中,大部分软件是处于全屏运行状态,这时候就需要在软件的界面上加上日期时间那些,方便用户查看当前时间. 二.功能实现 ...
最新文章
- mysql 5.7 安装错误提示总结
- SAP QM Quality Notification的凭证流
- ffmpeg源码分析——av_register_all
- [hiho1159] Poker
- 《java入门第一季》之面向对象(包概述)
- 联想ghost重装系统_一键ghost,详细教您使用一键ghost怎么重装win7系统
- 强化学习《基于策略 - Policy Grident》
- 大数据系列1-规划安排
- Maven 本地仓库明明有jar包,pom文件还是报错解决办法(Missing artifact...jar)
- python学习笔记:操作Excle
- 大厂Sketch组件库源文件
- 基于三维WebGL技术的公安三维项目
- 小智-微直播 使用教程
- flutter中的常见色值设置
- IOS error:Images.xcassets: error: ERROR: Each TDDistiller instance can be distilled only one time!
- andriod TV 获取已连接蓝牙遥控器电池电量总结
- “数据结构基础”系列网络课程主页
- 软件行业职位及相关缩写
- 数学——行向量和列向量
- 华为S系列交换机修改密码不成功