WPF:TemplateBinding到StrokeThickness的形状不起作用?

时间:2009-11-26 14:26:17

标签: .net wpf xaml .net-3.5 templatebinding

看起来ControlTemplate中的以下Ellipse没有获得BorderThickness,但为什么?

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

Foreground的TemplateBinding工作得很好,椭圆是绿色的。但是StrokeThickness它似乎不起作用,为什么?

4 个答案:

答案 0 :(得分:14)

另一种可能的解决方案......(因为我只想使用IValueConverters作为最后的手段,如果你需要将其设置为其他东西,更改Ellipse的DataContext可能不起作用):

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

这相当于原始意图(绑定到TemplatedParent),但使用长手标记可以指定路径而不仅仅是属性

答案 1 :(得分:5)

BorderThickness并不容易,它是Thickness类型的结构(可以是复合的,如BorderThickness=".0,.0,2,2"),而StrokeThickness属性的类型为{{ 1}}。

您需要double才能使此绑定工作。

答案 2 :(得分:1)

有命名问题:BorderThickness类型为ThicknessStrokeThickness类型为double。所以我们需要IValueConverter

答案 3 :(得分:1)

您还可以使用Ellipse的DataContext属性:

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

希望这有帮助!