日期:2014-05-17  浏览次数:20775 次

WPF,这个触发器为什么没有执行

<Window.Resources>
        <Style TargetType="Button">
            <Style.Triggers>
                <Trigger Property="IsPressed" Value="true">
                    <Setter Property = "Foreground" Value="Red"/> 
                    <Setter Property="Background" Value="Yellow" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid Height="100" Name="grid1" Width="200">
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="43,32,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
    </Grid>


当单击按钮的时候,为什么只有前景色变成了红色,而背景色却没有变成黄色?

------解决方案--------------------
BUTTON里面的内部不会因为Background而改变
你只有通过改变Template才可以
------解决方案--------------------
正如你所想的,你所看到的,像其他控件,比如说Border, StackPanel都可以直接设置其背景的。到了Button这里就不可以了。

首先这个Background属性是从Control继承过来的,所以你会看到Border, Button都有这个属性。

但是,由于Button是一个历史很悠久的控件,也是操作系统中最常见的控件。所以为了保持兼容性,及与操作系统保持一致性。WPF 在提供这个控件的时候就已经提供了一个Button默认的模板,这个模板并没有充分利用Background这个属性,即默认模板没有与这个属性绑定(template binding),而是设置成了与操作系统保持一致性的几种固定表现(mouseover, click等的表现)。所以如果你想利用Button的Background属性,那么你要为Button重新定义模板,在你自己的模板中绑定Background属性,如下面的一个例子:

<Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}">
                        <ContentPresenter/>
                    </Border>
                </ControlTemplate>


以上是我的理解,欢迎大家讨论指正。
------解决方案--------------------
引用:
正如你所想的,你所看到的,像其他控件,比如说Border, StackPanel都可以直接设置其背景的。到了Button这里就不可以了。

首先这个Background属性是从Control继承过来的,所以你会看到Border, Button都有这个属性。

但是,由于Button是一个历史很悠久的控件,也是操作系统中最常见的控件。所以为了保持兼容性,及与操作系统保持一致性。WPF 在提供这个控件的时候就已经提供了