2009-11-26 3 views
7

Похоже, что следующий Эллипс в ControlTemplate не получает BorderThickness, но почему?WPF: TemplateBinding для StrokeThickness of Shape не работает?

<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

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

Чтобы сделать это обязательным, вам понадобится IValueConverter.

+0

Прошу прощения, я уже нашел ответ. См. Ответ, который я написал ... Вы, вероятно, имели в виду это. – Ciantic

+0

Хорошо для вас :) Тем не менее, мое было раньше :) –

+0

Thats true! Я выберу ваше решение, если вы укажете разницу типов, это ключ здесь. – Ciantic

1

Было получено имя: BorderThickness - тип Thickness, а StrokeThickness - тип double. Поэтому нам нужно IValueConverter.

0

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

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

Надеется, что это помогает!

12

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

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

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

+0

Nit-pick на этом замечательном ответе: я считаю, что 'BorderThickness.Left' фактически является предпочтительным значением, поскольку оно является первым значением. См. [Этот ответ о марже] (https://stackoverflow.com/a/8522026/1518546), но [заказ одинаков для толщины] (https://docs.microsoft.com/en-us/dotnet/api /system.windows.thickness#xaml-values). –