diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
index e7b9e052..a911700e 100644
--- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
+++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
@@ -141,6 +141,7 @@
+
diff --git a/src/Shared/HandyControl_Shared/Tools/Extension/GridExtension.cs b/src/Shared/HandyControl_Shared/Tools/Extension/GridExtension.cs
new file mode 100644
index 00000000..ef01bc46
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Tools/Extension/GridExtension.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace HandyControl.Tools.Extension
+{
+ public class GridExtensions
+ {
+ public static readonly DependencyProperty NameProperty = DependencyProperty.RegisterAttached(
+ "Name", typeof(string), typeof(GridExtensions), new PropertyMetadata(default(string)));
+
+ public static void SetName(DependencyObject element, string value)
+ {
+ element.SetValue(NameProperty, value);
+ }
+
+ public static string GetName(DependencyObject element)
+ {
+ return (string) element.GetValue(NameProperty);
+ }
+
+ public static readonly DependencyProperty RowNameProperty = DependencyProperty.RegisterAttached(
+ "RowName", typeof(string), typeof(GridExtensions),
+ new PropertyMetadata(default(string), RowName_PropertyChanged));
+
+ private static void RowName_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is FrameworkElement frameworkElement)
+ {
+ if (e.NewValue is string rowName)
+ {
+ if (string.IsNullOrEmpty(rowName))
+ {
+ return;
+ }
+
+ if (frameworkElement.Parent is Grid grid)
+ {
+ for (var i = 0; i < grid.RowDefinitions.Count; i++)
+ {
+ var gridRowDefinition = grid.RowDefinitions[i];
+ var gridRowName = GetName(gridRowDefinition);
+ if (!string.IsNullOrEmpty(gridRowName) &&
+ gridRowName.Equals(rowName, StringComparison.Ordinal))
+ {
+ Grid.SetRow(frameworkElement, i);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public static void SetRowName(DependencyObject element, string value)
+ {
+ element.SetValue(RowNameProperty, value);
+ }
+
+ public static string GetRowName(DependencyObject element)
+ {
+ return (string) element.GetValue(RowNameProperty);
+ }
+
+ public static readonly DependencyProperty ColumnNameProperty = DependencyProperty.RegisterAttached(
+ "ColumnName", typeof(string), typeof(GridExtensions),
+ new PropertyMetadata(default(string), ColumnName_PropertyChanged));
+
+ private static void ColumnName_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is FrameworkElement frameworkElement)
+ {
+ if (e.NewValue is string columnName)
+ {
+ if (string.IsNullOrEmpty(columnName))
+ {
+ return;
+ }
+
+ if (frameworkElement.Parent is Grid grid)
+ {
+ for (var i = 0; i < grid.ColumnDefinitions.Count; i++)
+ {
+ var gridColumnDefinition = grid.ColumnDefinitions[i];
+ var gridColumnName = GetName(gridColumnDefinition);
+ if (!string.IsNullOrEmpty(gridColumnName) &&
+ gridColumnName.Equals(columnName, StringComparison.Ordinal))
+ {
+ Grid.SetColumn(frameworkElement, i);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public static void SetColumnName(DependencyObject element, string value)
+ {
+ element.SetValue(ColumnNameProperty, value);
+ }
+
+ public static string GetColumnName(DependencyObject element)
+ {
+ return (string) element.GetValue(ColumnNameProperty);
+ }
+ }
+}