Question

Je me demande s'il est possible de lier un élément de structure comme BorderThickness.Top à la propriété correspondante de TemplatedParent. J'ai essayé

<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 raison pour laquelle je veux faire est que je veux gauche et droite à 0 et seulement Haut et Bas sont liés.

Merci d'avance.

Était-ce utile?

La solution

Ceci est impossible car l'épaisseur est une valeur de type - vous ne pouvez créer des liaisons sur les propriétés de dépendance des objets de dépendance.

Ce que vous pouvez faire est de lier BorderThickness comme normal:

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

puis utilisez un convertisseur pour retourner une épaisseur modifiée de façon appropriée:

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 );
}

Vous pouvez même utiliser ConverterParameter pour spécifier les parties de l'épaisseur à effacer.

Autres conseils

La solution d'un convertisseur est la bonne.

Dans le cas où vous êtes intéressé que dans une seule valeur, vous pouvez le faire directement dans le XAML sans convertisseur . {TemplateBinding …} est seulement un sucre syntaxique pour {Binding RelativeSource={RelativeSource TemplatedParent} …} avec une fonctionnalité limitée.

Par exemple, certains bordure personnalisée:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top