GridAttach.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. namespace HandyControl.Controls;
  5. public class GridAttach
  6. {
  7. public static readonly DependencyProperty NameProperty = DependencyProperty.RegisterAttached(
  8. "Name", typeof(string), typeof(GridAttach), new PropertyMetadata(default(string)));
  9. public static void SetName(DependencyObject element, string value)
  10. => element.SetValue(NameProperty, value);
  11. public static string GetName(DependencyObject element)
  12. => (string) element.GetValue(NameProperty);
  13. public static readonly DependencyProperty RowNameProperty = DependencyProperty.RegisterAttached(
  14. "RowName", typeof(string), typeof(GridAttach), new PropertyMetadata(default(string), OnRowNameChanged));
  15. private static void OnRowNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  16. {
  17. if (d is FrameworkElement frameworkElement)
  18. {
  19. if (e.NewValue is string rowName)
  20. {
  21. if (string.IsNullOrEmpty(rowName))
  22. {
  23. return;
  24. }
  25. if (frameworkElement.Parent is Grid grid)
  26. {
  27. for (var i = 0; i < grid.RowDefinitions.Count; i++)
  28. {
  29. var gridRowDefinition = grid.RowDefinitions[i];
  30. var gridRowName = GetName(gridRowDefinition);
  31. if (!string.IsNullOrEmpty(gridRowName) &&
  32. gridRowName.Equals(rowName, StringComparison.Ordinal))
  33. {
  34. Grid.SetRow(frameworkElement, i);
  35. return;
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. public static void SetRowName(DependencyObject element, string value)
  43. => element.SetValue(RowNameProperty, value);
  44. public static string GetRowName(DependencyObject element)
  45. => (string) element.GetValue(RowNameProperty);
  46. public static readonly DependencyProperty ColumnNameProperty = DependencyProperty.RegisterAttached(
  47. "ColumnName", typeof(string), typeof(GridAttach), new PropertyMetadata(default(string), OnColumnNameChanged));
  48. private static void OnColumnNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  49. {
  50. if (d is FrameworkElement frameworkElement)
  51. {
  52. if (e.NewValue is string columnName)
  53. {
  54. if (string.IsNullOrEmpty(columnName))
  55. {
  56. return;
  57. }
  58. if (frameworkElement.Parent is Grid grid)
  59. {
  60. for (var i = 0; i < grid.ColumnDefinitions.Count; i++)
  61. {
  62. var gridColumnDefinition = grid.ColumnDefinitions[i];
  63. var gridColumnName = GetName(gridColumnDefinition);
  64. if (!string.IsNullOrEmpty(gridColumnName) &&
  65. gridColumnName.Equals(columnName, StringComparison.Ordinal))
  66. {
  67. Grid.SetColumn(frameworkElement, i);
  68. return;
  69. }
  70. }
  71. }
  72. }
  73. }
  74. }
  75. public static void SetColumnName(DependencyObject element, string value)
  76. => element.SetValue(ColumnNameProperty, value);
  77. public static string GetColumnName(DependencyObject element)
  78. => (string) element.GetValue(ColumnNameProperty);
  79. }