文本框在不使用模板的情况下从本地触发器禁用背景

时间:2011-10-25 15:38:21

标签: wpf wpf-controls

<Window x:Class="AiweeeTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <SolidColorBrush x:Key="backcolorType" Color="Red"></SolidColorBrush>
            <SolidColorBrush x:Key="forecolorType" Color="Green"></SolidColorBrush>
            <Style x:Key="TextboxStyle" TargetType="{x:Type TextBox}">
                <Setter Property="Background" Value="Yellow"/>
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" Value="{StaticResource backcolorType}"/>
                        <Setter Property="Foreground" Value="{StaticResource forecolorType}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
        <TextBox Name="textbox1" Width="100" Height="25" Style="{StaticResource TextboxStyle}" IsEnabled="False"/>
    </Grid>
</Window>

我无法使用上面定义的触发器更新文本框的背景,但是当我复制整个文本框控件模板模板并用我自己的颜色替换“DisabledBackgroundBrush”时,它确实如此。有什么区别,我已经看到了这个问题的一些联系;但是我无法理解它背后的原因。据我所知,触发器按照它们的定义顺序触发,然后在窗口中本地定义的触发器应该能够在禁用时覆盖文本框的背景颜色。请澄清。

PS:我不想在这里做任何特别的事,但只是想明白为什么会如此。这让我对WPF感到有些沮丧,因为对于这样的情况,WPF并不直观。

1 个答案:

答案 0 :(得分:0)

我猜它与WPF将为DependencyProperty应用值的顺序有关。 This MSDN article有关于依赖属性优先级的一些很好的信息

基本上顺序是:

  1. 物业系统强制
  2. 动态动画或具有保留行为的动画。
  3. 本地值
  4. TemplatedParent模板属性
  5. 来自TemplatedParent模板的触发器
  6. TemplatedParent模板中的属性集(通常通过XAML属性)
  7. 隐含风格
  8. 样式触发器
  9. 模板触发器
  10. 样式制定者
  11. 默认(主题)风格
  12. 主题样式中的活动触发器
  13. 主题样式的设置者
  14. 继承
  15. 依赖项属性元数据的默认值