Связывание только части свойства margin элемента управления WPF

У меня есть это:

... 

Я хочу привязать только "Top" часть TabControl, которая интуитивно я буду делать это следующим образом:

  ...  

Как мне это сделать ?

Вы пробовали использовать такой конвертер?

в VB.Net

 Public Class MarginConverter Implements IValueConverter Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert Return New Thickness(0, CDbl(value), 0, 0) End Function Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack Return Nothing End Function End Class 

Или в C #

 public class MarginConverter : IValueConverter { public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { return new Thickness(0, System.Convert.ToDouble(value), 0, 0); } public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { return null; } } 

XAML

            

Редактировать:
Использование MultiConverter

Также возможно получить все четыре значения во время выполнения и использовать MultiValueConverter. Верхнее свойство объекта толщины не является объектом-зависимым , поэтому вы не можете определить привязку к нему (если ваш источник не является объектом-зависимым).

XAML

                        

… и c #

  class MultiMarginConverter : IMultiValueConverter { public object Convert(object[] values, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { return new Thickness(System.Convert.ToDouble(values[0]), System.Convert.ToDouble(values[1]), System.Convert.ToDouble(values[2]), System.Convert.ToDouble(values[3])); } public object[] ConvertBack(object value, System.Type[] targetType, object parameter, System.Globalization.CultureInfo culture) { return null; } } 

Редактировать (2) Обратное связывание:
Я не уверен, что это сделает вас счастливыми. По моему скромному мнению, я постараюсь избежать этого, но нормально … Если ваш источник является Dependency-Property, вы можете привязать его к Margin:

  

Но у меня есть некоторые эффекты.
Хитрость заключается в том, что вы не привязываете часть Margin вашего TabControl к «что-то еще», а привязываете «что-то еще» к Margin вашего TabControl и указываете Binding-Mode OneWayToSource .

На самом деле свойство Margin элемента управления имеет тип Thickness . Поэтому мы можем привязать его к Property, если тип Thickness.

  public Thickness LeftMargin { get; set; } 

и вы также можете установить часть объекта «Толщина». Подобно –

  LeftMargin = new Thickness(20,0,0,0); 

и в Xaml мы можем привязать это свойство непосредственно к свойству margin любого элемента … вроде этого ..

   

Я использовал этот обходной путь для левого поля только с помощью StackPanel. Преимущество в том, что вам не нужен конвертер.

          

предварительный просмотр

Вы могли бы попробовать что-то вроде этого ответа из другого вопроса.

Решение использует прикрепленное свойство, которое позволяет XAML следующим образом:

  

Прикрепленное свойство также поддерживается функцией DependencyObject, поэтому привязка данных будет работать.

Из вашего кода я считаю, что ваше меню и tabControl могут перекрываться, поэтому вы хотите использовать маржу для их разделения. Я чувствую эту практику, как два макета CSS столбца.

Вернемся к сути, я думаю, вы можете применить TranslateFransform к TabControl.RenderTransform . Вы можете связать свойство Y

Чтобы расширить метод Ioop создания свойства для управления маржей вместо конвертера, если вы не привязываетесь к другому элементу WPF:

Создайте 4 стандартных свойства и свойство readonly, например,

 Public Class CustomMargin Implements INotifyPropertyChanged Private _Left As Double Private _Right As Double Private _Up As Double Private _Down As Double Public Sub New() _Up = 0 _Down = 0 _Left = 0 _Right = 0 End Sub Public Sub New(Vertical as Double, Horizontal as Double) _Up = Vertical _Down = Vertical _Left = Horizontal _Right = Horizontal End Sub Public Sub New(Left as Double, Up as Double, Right as Double, Down as Double) _Up = Up _Down = Down _Left = Left _Right = Right End Sub Public Property Left As Double Get Return _Left End Get Set(value As Double) _Left = value OnPropertyChanged(New PropertyChangedEventArgs("MyMargin")) End Set End Property Public Property Right As Double Get Return _Right End Get Set(value As Double) _Right = value OnPropertyChanged(New PropertyChangedEventArgs("MyMargin")) End Set End Property Public Property Up As Double Get Return _Up End Get Set(value As Double) _Up = value OnPropertyChanged(New PropertyChangedEventArgs("MyMargin")) End Set End Property Public Property Down As Double Get Return _Down End Get Set(value As Double) _Down = value OnPropertyChanged(New PropertyChangedEventArgs("MyMargin")) End Set End Property Public ReadOnly Property MyMargin As Thickness Get Return New Thickness(Left, Up, Right, Down) End Get End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Public Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs) If Not PropertyChangedEvent Is Nothing Then RaiseEvent PropertyChanged(Me, e) End If End Sub End Class 

Тогда вам просто нужно добавить XAML

  

Затем по коду, расположенному по окну WPF,

 Private _NewMargin as New CustomMargin Public Sub New() InitializeComponent() MyLabel.DataContext = _NewMargin End Sub 

Оттуда вы можете использовать любой элемент управления, который вы хотите поменять все 4 поля отдельно, а Class можно использовать повторно для других элементов управления.

Давайте будем гением компьютера.