Pregunta

Parece que la siguiente Elipse en ControlTemplate no obtiene el BorderThickness, pero ¿por qué?

<Window.Resources>
    <ControlTemplate x:Key="EllipseControlTemplate" TargetType="{x:Type TextBox}">
        <Grid>
            <Ellipse 
                Width="{TemplateBinding ActualWidth}" 
                Height="{TemplateBinding ActualHeight}" 
                Stroke="{TemplateBinding Foreground}" 
                StrokeThickness="{TemplateBinding BorderThickness}" />
                <ScrollViewer Margin="0" x:Name="PART_ContentHost" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <TextBox
        Template="{DynamicResource EllipseControlTemplate}" 
        Foreground="Green"
        BorderThickness="15" />
</Grid>

TemplateBinding to Foreground funciona bien, la elipse es verde. Pero para StrokeThickness no parece funcionar, ¿por qué?

¿Fue útil?

Solución

BorderThickness no es tan fácil, es una estructura de tipo Thickness (y puede ser compuesta, como BorderThickness = " .0, .0, 2,2 " ), mientras que la propiedad StrokeThickness es de tipo doble .

Necesita IValueConverter para hacer que este enlace funcione.

Otros consejos

Otra solución posible ... (porque me gusta usar solo IValueConverters como último recurso, y cambiar el DataContext de Ellipse podría no funcionar si necesita configurarlo para otra cosa):

<Ellipse StrokeThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness.Top}" />

Esto es equivalente a la intención original (para enlazar con el TemplatedParent), pero usar el marcado de mano larga le permite especificar una ruta en lugar de solo una propiedad

Se nombró gotcha: BorderThickness es el tipo de Thickness , y StrokeThickness es el tipo de double . Así que necesitamos IValueConverter .

También puede usar la propiedad DataContext de Ellipse:

<Ellipse DataContext="{TemplateBinding BorderThickness}" StrokeThickness="{Binding Top}" />

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top