schangxiang@126.com
2025-11-04 ca398287db3f5ea01f03aac4a85edb13b28100a6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Media;
 
namespace XHandler.Controls
{
    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)
        {
 
        }
        #endregion
 
        public 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)
        {
 
        }
        #endregion
 
        private static void GridLoaded(object sender, RoutedEventArgs e)
        {
            #region 思路
            /*
             * 1、覆盖所有单元格都要包围上边框。
             * 2、边框线不能存在重复。每个单元格绘制【右下】部分,主体绘制右上部分
             */
            #endregion
            var 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];
            #endregion
            var controls = grid.Children;
            var count = controls.Count;
            var settingThickness = 0;//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;
        }
    }
 
}