2016-08-24 5 views
0

У меня есть стиль по умолчанию для всех текстовых полей. Что-то вроде этого:Переопределение триггера из стиля, влияющего на управление внутри шаблона

<Style TargetType="{x:Type TextBox}"> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type TextBox}"> 
     <Border x:Name="vaBorder" BorderThickness="1" CornerRadius="0" Padding="2,1,0,1" 
         BorderBrush="{TemplateBinding BorderBrush}"> 
     <Grid> 
      <ScrollViewer x:Name="PART_ContentHost" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
     </Grid>   
     </Border> 
     <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter TargetName="vaBorder" Property="Background" Value="{DynamicResource {x:Static Themes:ResourceKeys.DisabledControlBackground}}"/> 
      <Setter TargetName="PART_ContentHost" Property="Opacity" Value="0.7"/> 
     </Trigger> 
     <Trigger Property="IsReadOnly" Value="True"> 
      <Setter TargetName="vaBorder" Property="Background" Value="{DynamicResource {x:Static Themes:ResourceKeys.DisabledControlBackground}}"/> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 

Как вы можете видеть, что есть триггер, который изменяет фон управления vaBorder когда TextBox IsReadOnly свойство имеет значение True.

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

Возможно ли это сделать, просто переопределив триггеры стиля, или мне нужно в значительной степени создать новый стиль и переопределить весь шаблон с нуля?

ответ

1

Вы должны overrid ControlTemplate переопределить ваши ControlTemplate.Triggers

У вас есть 2 решения:

  1. Создание нового стиля на странице, где вы, что другой фон для vaBorder
  2. Создать прикрепленную недвижимость от типа Brush и назначить их из Style setter. Изм. Модель:

    a). Добавьте границу для каждого состояния: граница «отключена» и «Readonly».

    b). Свяжите свойства Фон в ваших границах с соответствующими прикрепленными свойствами

    c). В ваших триггерах изменяются видимость вместо смены фона

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

Для переднего плана - реализовать ту же идею. Надеюсь, я ясно дал понять.

Attached свойство:

public class Helper 
{ 

    public static Brush GetReadonlyBackground(DependencyObject obj) 
    { 
     return (Brush)obj.GetValue(ReadonlyBackgroundProperty); 
    } 

    public static void SetReadonlyBackground(DependencyObject obj, Brush value) 
    { 
     obj.SetValue(ReadonlyBackgroundProperty, value); 
    } 

    public static readonly DependencyProperty ReadonlyBackgroundProperty = 
     DependencyProperty.RegisterAttached("ReadonlyBackground", typeof(Brush), typeof(Helper), new PropertyMetadata(null)); 


} 

Стиль:

<Style TargetType="{x:Type TextBox}"> 
     <Setter Property="local:Helper.ReadonlyBackground" 
       Value="HotPink" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TextBox}"> 
        <Grid> 
         <Border x:Name="vaBorder" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           CornerRadius="0" 
           Background="{TemplateBinding Background}" 
           BorderBrush="{TemplateBinding BorderBrush}" /> 
         <Border x:Name="BorderRadonly" 
           Visibility="Collapsed" 
           Background="{Binding Path=(local:Helper.ReadonlyBackground),RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TextBox}}}" /> 
         <ScrollViewer x:Name="PART_ContentHost" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 

        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEnabled" 
           Value="False"> 
          <Setter TargetName="vaBorder" 
            Property="Background" 
            Value="DarkGray" /> 
          <Setter TargetName="PART_ContentHost" 
            Property="Opacity" 
            Value="0.7" /> 
         </Trigger> 
         <Trigger Property="IsReadOnly" 
           Value="True"> 
          <Setter TargetName="BorderRadonly" 
            Property="Visibility" 
            Value="Visible" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Использование:

<StackPanel> 
    <TextBox Text="Text Text" 
      IsReadOnly="True" /> 
    <TextBox Text="Text Text" 
      IsReadOnly="True" 
      local:Helper.ReadonlyBackground="Aqua" /> 
</StackPanel> 

Результат:

enter image description here

Смежные вопросы