【问题标题】:Overriding Trigger from Style that is affecting control inside Template覆盖影响模板内控制的样式的触发器
【发布时间】:2016-12-31 17:09:48
【问题描述】:

我有所有文本框的默认样式。像这样的:

<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>

如您所见,当 TextBox IsReadOnly 属性设置为 True 时,有一个触发器会更改 vaBorder 控件的背景。

我在我的页面上放置了一个 TextBox 控件,但对于这个特定页面,我希望 TextBox 内的那个 vaBorder 控件的背景是不同的颜色加上使文本不透明。

是否可以通过以某种方式覆盖样式触发器来做到这一点,还是我需要创建新样式并从头开始覆盖整个模板?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    你需要覆盖 ControlTemplate 来覆盖你的 ControlTemplate.Triggers

    您有 2 个解决方案:

    1. 在您为 vaBorder 提供其他背景的页面上创建新样式
    2. 从类型画笔创建附加属性并从样式设置器分配它们。修改您的 ControlTemplate:

      一)。为每个状态添加边框:DisabledBorder 和 Readonly 边框。

      b)。将边框中的属性背景绑定到适当的附加属性

      c)。在您的触发器中更改可见性而不是更改背景

      d)。在您想要使用其他颜色的页面中,为这些附加属性应用不同的值。

    对于前景 - 实现相同的想法。我希望我已经说清楚了。

    附加属性

     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>
    

    结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多