WPF: TemplateBinding для StrokeThickness of Shape не работает? - PullRequest
7 голосов
/ 26 ноября 2009

Похоже, что следующий эллипс в ControlTemplate не получает 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>

TemplateBinding к Foreground работает просто отлично, эллипс зеленый. Но к StrokeThickness это не работает, почему?

Ответы [ 4 ]

14 голосов
/ 09 октября 2012

Другое возможное решение ... (потому что мне нравится использовать только IValueConverters в качестве крайней меры, и изменение DataContext для Ellipse может не сработать, если вам нужно установить его на другое значение):

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

Это эквивалентно первоначальному намерению (связать с TemplatedParent), но использование разметки длинной руки позволяет вам указать путь, а не просто свойство

5 голосов
/ 26 ноября 2009

BorderThickness не так просто, это структура типа Thickness (и может быть составной, как BorderThickness=".0,.0,2,2"), а свойство StrokeThickness имеет тип double.

Вам нужно IValueConverter, чтобы эта привязка работала.

1 голос
/ 14 июня 2012

Вы также можете использовать свойство DataContext Ellipse:

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

Надеюсь, это поможет!

1 голос
/ 26 ноября 2009

Произошло присвоение имени: BorderThickness - тип Thickness, StrokeThickness - тип double. Итак, нам нужно IValueConverter.

...