Pregunta

Me pregunto si es posible enlazar un elemento de estructura como BorderThickness.Top a la propiedad correspondiente de TemplatedParent. He tratado

<Border Margin="0" Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}">
    <Border.BorderThickness>
        <Thickness Left="0" Right="0" Top="{TemplateBinding BorderThickness.Top}" Bottom="{TemplateBinding BorderThickness.Bottom}"/>
    </Border.BorderThickness>
</Border>

La razón por la que quiero hacer esto es lo que quiero izquierdo y derecho a ser 0 y sólo superior e inferior pueden unir.

Gracias de antemano.

¿Fue útil?

Solución

Esto no es posible porque Espesor es un tipo de valor - sólo se puede crear enlaces sobre las propiedades de dependencia de objetos de dependencia.

Lo que podría hacer es vinculante BorderThickness de forma normal:

<Border Margin="0" 
        Padding="{TemplateBinding Padding}" 
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness, Converter={StaticResource ThicknessConverter}}" />

a continuación, utilizar un convertidor para devolver un espesor adecuadamente modificado:

object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
    var thickness = (Thickness) value;
    return new Thickness( 0.0, thickness.Top, 0.0, thickness.Bottom );
}

Incluso podría utilizar ConverterParameter para especificar qué partes del espesor para borrar.

Otros consejos

La solución con un convertidor es la correcta.

En el caso de que usted está interesado únicamente en un valor, puede hacerlo directamente en el XAML sin convertidor de . {TemplateBinding …} sólo es un azúcar sintáctica para {Binding RelativeSource={RelativeSource TemplatedParent} …} con una funcionalidad limitada.

Por ejemplo, algunos borde personalizado:

<Button BorderBrush="Purple"
        BorderThickness="1 2 3 4"
        Content="This is a button!">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <DockPanel>
                <Rectangle DockPanel.Dock="Left"
                           Width="{Binding BorderThickness.Left, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <Rectangle DockPanel.Dock="Top"
                           Height="{Binding BorderThickness.Top, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <Rectangle DockPanel.Dock="Right"
                           Width="{Binding BorderThickness.Right, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <Rectangle DockPanel.Dock="Bottom"
                           Height="{Binding BorderThickness.Bottom, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <ContentPresenter />
            </DockPanel>
        </ControlTemplate>
    </Button.Template>
</Button>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top