2016-11-17 2 views
0

У меня есть несколько стилей, подобных этому (слева, справа, в центре), которые отличаются только тем, в каких углах (если они есть) закруглены.Установить свойство вложенного элемента в стиле WPF

<Style x:Key="ToggleRadioButtonLeft" 
     TargetType="{x:Type ToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ToggleButton"> 
       <Border BorderBrush="Blue" 
         Background="{TemplateBinding Background}" 
         Padding="15,0" 
         BorderThickness="1" 
         CornerRadius="10,0,0,10"> <!-- extract this --> 
        <ContentPresenter HorizontalAlignment="Center" 
             VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsChecked" Value="True"> 
      <Setter Property="Background" Value="Blue"/> 
      <Setter Property="Foreground" Value="White"/> 
     </Trigger> 
     <Trigger Property="IsChecked" Value="False"> 
      <Setter Property="Background" Value="White"/> 
      <Setter Property="Foreground" Value="Black"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Я хотел бы быть в состоянии создать единый базовый стиль без закругленных углов любых (то есть центр типа кнопки), а затем еще два на его основе, которые устанавливают закругленные углы для левых и правых элементов, но я не могу понять, как установить радиус границы в производном стиле, потому что это не элемент верхнего уровня в стиле.

+0

Я использовал этот подход успешно: http://stackoverflow.com/questions/9232502/шаблон-связывающий-с прикрепленными-свойствами. вкратце: создать прикрепленное свойство и установить его значение через set setter. шаблон может создать привязку к этому свойству – ASh

+0

@ASh вы могли бы разработать? Что происходит в этом вопросе более сложно, чем я могу легко разобрать. –

+0

Используйте 4 отдельных ресурса, подобных этому '' и используйте их в вашем стиле 'Style', используя' DynamicResource'. – AnjumSKhan

ответ

1

Я знаю 3 варианта настройки шаблона, как вы ищете

1) создать UserControl, полученный из ToggleButton, добавить свойство в RadiusValue зависимость есть (типа CornerRadius) и использовать его в шаблоне управления: CornerRadius="{TemplateBinding RadiusValue}" ,

2) использовать динамический ресурс.

после запуска в контрольно-пропускной пункт с динамическими ресурсами (Wpf dynamic resource lookup for Validation.ErrorTemplate) Я предпочитаю третий один

3) использовать свойство прикрепленных зависимостей

сначала я создал присоединенную DP типа CornerRadius (с радиусом по умолчанию = 3)

public static class Attached 
{ 
    public static readonly DependencyProperty RadiusValueProperty = 
     DependencyProperty.RegisterAttached("RadiusValue", typeof (CornerRadius), typeof (Attached), new FrameworkPropertyMetadata(new CornerRadius(3))); 


    public static void SetRadiusValue(DependencyObject element, CornerRadius value) 
    { 
     element.SetValue(RadiusValueProperty, value); 
    } 

    public static CornerRadius GetRadiusValue(DependencyObject element) 
    { 
     return (CornerRadius)element.GetValue(RadiusValueProperty); 
    } 
} 

после этого я изменил пользовательский шаблон ToggleButton:

<Style x:Key="ToggleRadioButton" 
     TargetType="{x:Type ToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ToggleButton"> 
       <Border BorderBrush="Blue" 
       Background="{TemplateBinding Background}" 
       Padding="15,0" 
       BorderThickness="1" 
       CornerRadius="{Binding Path=(local:Attached.RadiusValue), 
        RelativeSource={RelativeSource TemplatedParent}}"> 
        <ContentPresenter HorizontalAlignment="Center" 
           VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsChecked" Value="True"> 
      <Setter Property="Background" Value="Blue"/> 
      <Setter Property="Foreground" Value="White"/> 
     </Trigger> 
     <Trigger Property="IsChecked" Value="False"> 
      <Setter Property="Background" Value="White"/> 
      <Setter Property="Foreground" Value="Black"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

единственное изменение (кроме ключа) является

CornerRadius="{Binding Path=(local:Attached.RadiusValue), 
       RelativeSource={RelativeSource TemplatedParent}}"> 

и, наконец, полученный стиль для левой RadioButton, основанный на ToggleRadioButton

<Style x:Key="ToggleRadioButtonLeft" 
     TargetType="{x:Type ToggleButton}" 
     BasedOn="{StaticResource ToggleRadioButton}"> 
    <Setter Property="local:Attached.RadiusValue" Value="10,0,0,10"/> 
</Style>