Encuadernación solo de parte de la propiedad de margen del control WPF

Tengo esto:

... 

Quiero vincular solo la parte "Top" de TabControl, que intuitivamente lo haría de esta manera:

  ...  

Cómo lo hago ?

¿Has intentado usar un convertidor como este?

en 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 

O en 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

            

Editar:
Usando un MultiConverter

También es posible obtener los cuatro valores durante el tiempo de ejecución y usar un MultiValueConverter. La Propiedad Superior del Objeto de Espesor no es un Objeto de Dependencia , por lo que no puede definir una vinculación (a menos que su fuente no sea un Objeto de Dependencia).

XAML

                        

… y 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; } } 

Editar (2) Encuadernación inversa:
No estoy seguro si esto te hará feliz. En mi humilde opinión, trataría de evitar esto, pero está bien … Si tu fuente es una Dependency-Property, puedes vincular esto al Margen:

  

Pero tengo algunos efectos con esto.
El truco es que no vincula una parte del margen de su TabControl a “otra cosa”, sino que vincula “algo más” al margen de su TabControl y especifica el modo de enlace OneWayToSource .

En realidad, la propiedad Margin de un control es de Tipo de Thickness . Entonces podemos vincularlo a Propiedad si escribe Grosor.

  public Thickness LeftMargin { get; set; } 

y Usted puede configurar una parte de un objeto de Espesor también. Me gusta –

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

y en Xaml podemos unir esta propiedad directamente a la propiedad de margen de cualquier elemento … como este …

   

He usado esta solución para el margen izquierdo solo con StackPanel. El beneficio es que no necesita ningún convertidor.

          

avance

Podría intentar algo así como esta respuesta de otra pregunta.

La solución utiliza una propiedad adjunta que permite XAML como el siguiente:

  

La propiedad adjunta también está respaldada por un DependencyObject, por lo que el enlace de datos funcionará.

Desde su código, me imagino que su menú y tabControl pueden superponerse, por lo que desea usar margen para separarlos. Siento esta práctica como dos diseños de columna CSS.

Volviendo al punto, creo que puede aplicar TranslateFransform a TabControl.RenderTransform . Puede enlazar la propiedad Y

Para expandir el método de Ioop de hacer una propiedad para controlar el margen en lugar de un convertidor, si no está adjuntando a otro elemento de WPF:

Cree 4 propiedades estándar y una propiedad de solo lectura, como por ejemplo-

 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 

Entonces solo tienes que agregar el XAML

  

Luego en el código detrás de la ventana de WPF-

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

Desde allí puede usar cualquier control que desee para cambiar los 4 márgenes por separado y la Class es reutilizable para otros controles.

    Intereting Posts