2015-09-07 1 views
0

Если я следующий XAML определено в Generic.xamlпереопределение шаблона управления собственностью в XAML

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="CaretBrush" Value="{StaticResource TextBoxCaretBrush}" /> 
    <Setter Property="OverridesDefaultStyle" Value="True" /> 
    <Setter Property="KeyboardNavigation.TabNavigation" Value="None" /> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    <Setter Property="MinWidth" Value="120" /> 
    <Setter Property="MinHeight" Value="20" /> 
    <Setter Property="AllowDrop" Value="True" /> 
    <Setter Property="Foreground" Value="{StaticResource TextBoxTextBrush}" /> 
    <Setter Property="Padding" Value="5,3,0,5" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
       <Border x:Name="Border" CornerRadius="5" Padding="2" BorderThickness="1"> 
        <Border.Background> 
         <SolidColorBrush Color="{StaticResource TextBoxBackgroundColor}" /> 
        </Border.Background> 
        <Border.BorderBrush> 
         <SolidColorBrush Color="{StaticResource TextBoxBorderColor}" /> 
        </Border.BorderBrush> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal" /> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{StaticResource DisabledControlLightColor}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="ReadOnly"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{StaticResource DisabledControlDarkColor}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="MouseOver" /> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <ScrollViewer Margin="0" x:Name="PART_ContentHost" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsFocused" Value="True"> 
         <Setter Property="BorderBrush" TargetName="Border" Value="{StaticResource TextBoxBorderSelectedBrush}" /> 
         <Setter Property="Effect"> 
          <Setter.Value> 
           <DropShadowEffect ShadowDepth="0" Color="{StaticResource HighlightColor}" Opacity="1" BlurRadius="5" /> 
          </Setter.Value> 
         </Setter> 
         <Setter Property="BorderThickness" Value="2" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

И на мой взгляд, я определил следующий код XAML, чтобы отобразить TextBox с использованием вышеуказанного стиля.

<TextBox Name="UserName" attachedProperties:KeyboardNavigationExt.TabOnEnter="True" Grid.Row="1" KeyboardNavigation.TabIndex="1" Grid.Column="2" Grid.ColumnSpan="3" cal:Message.Attach="[Event TextChanged] = [Action CanLogin]" /> 

Этот дисплей текстовое поле на представлении с CornerRadius 5 на Border в Template.

Теперь для моего вопроса у меня есть сценарий, в котором есть два текстовых блока рядом друг с другом, и я хотел бы указать CornerRadius для обоих текстовых полей, как показано ниже.

<TextBox Name="UserName" CornerRadius="5,5,0,0" attachedProperties:KeyboardNavigationExt.TabOnEnter="True" Grid.Row="1" KeyboardNavigation.TabIndex="1" Grid.Column="2" Grid.ColumnSpan="3" cal:Message.Attach="[Event TextChanged] = [Action CanLogin]" /> 

Но TextBox не имеет CornerRadius, как я могу добиться этого, так что я могу изменить CornerRadius в Border в окне просмотра XAML

+0

Создайте другой вложенное свойство (прокси), как вы делали с 'KeyboardNavigationExt.TabOnEnter', но это один из типов' CornerRadius', установленное значение по умолчанию в 'Style' и в шаблоне привязки' ConrnerRadius' к тому, что прикрепленное свойство «TemplatedParent». Таким образом вы сможете изменить значение для 'TextBox'. Проверьте [this] (http://stackoverflow.com/questions/31774408/change-style-during-runtime/31774718#31774718) answer – dkozl

+0

Как мне связать это в шаблоне? Я попробовал 'CornerRadius =" {TemplateBinding CornerRadius} ", но я получаю сообщение об ошибке –

+0

Посмотрите ссылку на ответ в предыдущем комментарии. Вы используете 'RelativeSource' для связывания' TemplatedParent' – dkozl

ответ

4

Как уже упоминалось в комментарии вам нужно прокси-свойство, может устанавливаться против TextBox и связывать в шаблоне. Так создать AttachedProprty из CornerRadius типа

public static class AttachedProperties 
{ 
    public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.RegisterAttached("CornerRadius", typeof(CornerRadius), typeof(AttachedProperties), new UIPropertyMetadata()); 

    public static void SetCornerRadius(DependencyObject d, CornerRadius source) 
    { 
     d.SetValue(CornerRadiusProperty, source); 
    } 

    public static CornerRadius GetCornerRadius(DependencyObject d) 
    { 
     return (CornerRadius)d.GetValue(CornerRadiusProperty); 
    } 
} 

изменения ControlTemplate и привязку к этому свойству TemplatedParent

<ControlTemplate TargetType="{x:Type TextBox}"> 
    <Border CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:AttachedProperties.CornerRadius)}"/> 
</ControlTemplate> 

добавить Setter к вашему Style со значением по умолчанию

<Setter Property="local:AttachedProperties.CornerRadius" Value="5"/> 

, а затем вы можете изменить его вручную против каждого TextBox

<TextBox local:AttachedProperties.CornerRadius="5,5,0,0" .../>