| | |
| | | using System.Windows; |
| | | using System.Collections.Generic; |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | | using System.Windows.Controls.Primitives; |
| | | using System.Windows.Media; |
| | | |
| | | namespace HMI.UI.DpUtil |
| | | { |
| | | public class GridHelper |
| | | { |
| | | #region Space |
| | | public static double GetSpace(DependencyObject obj) |
| | | { |
| | | return (double)obj.GetValue(SpaceProperty); |
| | |
| | | { |
| | | obj.SetValue(SpaceProperty, value); |
| | | } |
| | | |
| | | public static readonly DependencyProperty SpaceProperty = |
| | | DependencyProperty.RegisterAttached("Space", typeof(double), typeof(Grid), |
| | | new PropertyMetadata(0d, OnShowBorderChanged)); |
| | | new PropertyMetadata(0d, OnSpaceChanged)); |
| | | |
| | | private static void OnShowBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) |
| | | private static void OnSpaceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) |
| | | { |
| | | if (d is Grid grid) |
| | | { |
| | |
| | | (row + rowSpan) == rowCount ? space : 0); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | public static Brush GetInnerBorderBrush(DependencyObject obj) |
| | | { |
| | | return (Brush)obj.GetValue(InnerBorderBrushProperty); |
| | | } |
| | | public static void SetInnerBorderBrush(DependencyObject obj, Brush value) |
| | | { |
| | | obj.SetValue(InnerBorderBrushProperty, value); |
| | | } |
| | | public static readonly DependencyProperty InnerBorderBrushProperty = |
| | | DependencyProperty.RegisterAttached("InnerBorderBrush", typeof(Brush), typeof(Grid), |
| | | new PropertyMetadata(null, OnInnerBorderChanged)); |
| | | |
| | | public static double GetInnerBorder(DependencyObject obj) |
| | | { |
| | | return (double)obj.GetValue(InnerBorderProperty); |
| | | } |
| | | |
| | | public static void SetInnerBorder(DependencyObject obj, object value) |
| | | { |
| | | double dv = double.Parse(value.ToString()); |
| | | obj.SetValue(InnerBorderProperty, dv); |
| | | } |
| | | |
| | | public static readonly DependencyProperty InnerBorderProperty = |
| | | DependencyProperty.RegisterAttached("InnerBorder", typeof(object), typeof(Grid), |
| | | new PropertyMetadata(0, OnInnerBorderChanged)); |
| | | |
| | | public static string GetInnerBorderIgnore(DependencyObject obj) |
| | | { |
| | | return (string)obj.GetValue(InnerBorderIgnoreProperty); |
| | | } |
| | | public static void SetInnerBorderIgnore(DependencyObject obj, string value) |
| | | { |
| | | obj.SetValue(InnerBorderIgnoreProperty, value); |
| | | } |
| | | |
| | | public static readonly DependencyProperty InnerBorderIgnoreProperty = |
| | | DependencyProperty.RegisterAttached("InnerBorderIgnore", typeof(string), |
| | | typeof(Grid), new PropertyMetadata("None", OnInnerBorderChanged)); |
| | | |
| | | private static void OnInnerBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) |
| | | { |
| | | if (d is Grid grid) |
| | | { |
| | | if (e.Property == InnerBorderProperty || e.Property == InnerBorderIgnoreProperty) |
| | | { |
| | | grid.Loaded += GridInnerBorder_Loaded; |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private static void GridInnerBorder_Loaded(object sender, RoutedEventArgs e) |
| | | { |
| | | Grid grid = sender as Grid; |
| | | RefreshGridInnerBorder(grid); |
| | | grid.Loaded -= GridInnerBorder_Loaded; |
| | | } |
| | | |
| | | public static void RefreshGridInnerBorder(Grid grid) |
| | | { |
| | | double width = GetInnerBorder(grid); |
| | | if (width <= 0) return; |
| | | var rowCount = grid.RowDefinitions.Count; |
| | | var columnCount = grid.ColumnDefinitions.Count; |
| | | int totalCount = rowCount * columnCount; |
| | | |
| | | string baseData = GetInnerBorderIgnore(grid); |
| | | HashSet<string> data = new HashSet<string>(baseData.Split(',')); |
| | | bool ignoreTop = data.Contains("All") || data.Contains("Top"), |
| | | ignoreBottom = data.Contains("All") || data.Contains("Bottom"), |
| | | ignoreLeft = data.Contains("All") || data.Contains("Left"), |
| | | ignoreRight = data.Contains("All") || data.Contains("Right"); |
| | | |
| | | foreach (var child in grid.Children) |
| | | { |
| | | if (child is Control control) |
| | | { |
| | | Thickness bt; |
| | | Brush bb = GetInnerBorderBrush(grid) ?? Brushes.Black; |
| | | |
| | | |
| | | if (GetSpace(grid) > width) |
| | | { |
| | | bt = new Thickness(width); |
| | | } |
| | | else |
| | | { |
| | | int row = Grid.GetRow(control), |
| | | col = Grid.GetColumn(control), |
| | | rowSpan = Grid.GetRowSpan(control), |
| | | colSpan = Grid.GetColumnSpan(control); |
| | | |
| | | double left = (col == 0 && ignoreLeft) ? 0 : width; |
| | | double top = (row == 0 && ignoreTop) ? 0 : width; |
| | | |
| | | double right = ignoreRight ? 0 : ((col + colSpan == columnCount) ? width : 0); |
| | | double bottom = ignoreBottom ? 0 : ((row + rowSpan == rowCount) ? width : 0); |
| | | |
| | | bt = new Thickness(left, top, right, bottom); |
| | | } |
| | | control.BorderBrush = bb; |
| | | control.BorderThickness = bt; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |