Ключ должен понять, что установка его в коде так:
sp2.Margin = new System.Windows.Thickness{ Left = 5 };
эквивалентно:
sp2.Margin = new System.Windows.Thickness{ Left = 5, Top = 0, Right = 0, Bottom = 0 };
Вы не можете установить только одно значение в экземпляре Thickness
с помощью либо кода, либо XAML . Если вы не установите некоторые значения, они будут неявно равны нулю. Поэтому вы можете просто сделать это, чтобы преобразовать принятый пример кода в вашем другом вопросе в эквивалент XAML:
<StackPanel Margin="{Binding TopMargin, Converter={StaticResource MyConverter}}"/>
где MyConverter
просто возвращает Thickness
, который устанавливает только Top
и оставляет все остальные значения равными нулю.
Конечно, вы можете написать свой собственный элемент управления, который действительно представляет эти отдельные значения как свойства зависимостей, чтобы сделать ваш код немного чище:
<CustomBorder TopMargin="{Binding TopMargin}">
</CustomBorder>
Лучшим вариантом, чем пользовательский элемент управления, было бы написать присоединенное свойство и изменить толщину, используя приведенный выше код в установщике свойств зависимостей. Приведенный ниже код будет использоваться для ВСЕХ элементов управления, которые имеют поле.
public static readonly DependencyProperty TopMarginProperty =
DependencyProperty.RegisterAttached("TopMargin", typeof(int), typeof(FrameworkElement),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public static void SetTopMargin(FrameworkElement element, int value)
{
// set top margin in element.Margin
}
public static int GetTopMargin(FrameworkElement element)
{
// get top margin from element.Margin
}
Если вы связываете это с поведением, вы можете получать уведомления об изменениях в свойстве TopMargin.