GridHelper.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. 
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Media;
  5. namespace FWindSoft.Wpf.Controls
  6. {
  7. public class GridHelper
  8. {
  9. public static readonly DependencyProperty ShowBorderProperty =
  10. DependencyProperty.RegisterAttached("ShowBorder", typeof (bool), typeof (GridHelper)
  11. , new PropertyMetadata(OnShowBorderChanged));
  12. public static readonly DependencyProperty GridLineThicknessProperty =
  13. DependencyProperty.RegisterAttached("GridLineThickness", typeof (double), typeof (GridHelper),
  14. new PropertyMetadata(OnGridLineThicknessChanged));
  15. public static readonly DependencyProperty GridLineBrushProperty =
  16. DependencyProperty.RegisterAttached("GridLineBrush", typeof (Brush), typeof (GridHelper),
  17. new PropertyMetadata(OnGridLineBrushChanged));
  18. public static bool GetShowBorder(DependencyObject obj)
  19. {
  20. return (bool) obj.GetValue(ShowBorderProperty);
  21. }
  22. public static void SetShowBorder(DependencyObject obj, bool value)
  23. {
  24. obj.SetValue(ShowBorderProperty,value);
  25. }
  26. public static void OnShowBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  27. {
  28. var grid = d as Grid;
  29. if ((bool) e.OldValue)
  30. grid.Loaded -= (s, arg) => { };
  31. else
  32. {
  33. grid.Loaded += new RoutedEventHandler(GridLoaded);
  34. }
  35. }
  36. public static double GetGridLineThickness(DependencyObject obj)
  37. {
  38. return (double) obj.GetValue(GridLineThicknessProperty);
  39. }
  40. public static void SetGridLineThickness(DependencyObject obj,double value)
  41. {
  42. obj.SetValue(GridLineThicknessProperty, value);
  43. }
  44. public static void OnGridLineThicknessChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  45. {
  46. }
  47. public static Brush GetGridLineBrush(DependencyObject obj)
  48. {
  49. var brush= (Brush) obj.GetValue(GridLineBrushProperty);
  50. return brush ?? Brushes.LightGray;
  51. }
  52. public static void SetGridLineBrush(DependencyObject obj, Brush value)
  53. {
  54. obj.SetValue(GridLineBrushProperty,value);
  55. }
  56. public static void OnGridLineBrushChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  57. {
  58. }
  59. private static void GridLoaded(object sender, RoutedEventArgs e)
  60. {
  61. var grid = sender as Grid;
  62. var row_count = grid.RowDefinitions.Count;
  63. var column_count = grid.ColumnDefinitions.Count;
  64. var controls = grid.Children;
  65. var count = controls.Count;
  66. for (int i = 0; i < count; i++)
  67. {
  68. var item = controls[i] as FrameworkElement;
  69. var row = Grid.GetRow((item));
  70. var column = Grid.GetColumn(item);
  71. var rowspan = Grid.GetColumnSpan(item);
  72. var columnspan = Grid.GetColumnSpan(item);
  73. var settingThickness = GetGridLineThickness(grid);
  74. var thickness = new Thickness(settingThickness/2);
  75. if (row == 0)
  76. thickness.Top = settingThickness;
  77. if (row + rowspan == row_count)
  78. thickness.Bottom = settingThickness;
  79. if (column == 0)
  80. thickness.Left = settingThickness;
  81. if (column + columnspan==column_count)
  82. thickness.Right = settingThickness;
  83. var border = new Border()
  84. {
  85. BorderBrush = GetGridLineBrush(grid),
  86. BorderThickness = thickness,
  87. //Padding = new Thickness(0)
  88. };
  89. Grid.SetRow(border,row);
  90. Grid.SetColumn(border,column);
  91. Grid.SetRowSpan(border,rowspan);
  92. Grid.SetColumnSpan(border,columnspan);
  93. grid.Children.RemoveAt(i);
  94. border.Child = item;
  95. grid.Children.Insert(i,border);
  96. }
  97. }
  98. }
  99. }