当IsPressed为true时,为什么按钮背景默认为灰色

时间:2010-04-27 00:26:05

标签: wpf xaml triggers click

我有一个简单的问题。使用IsPressed触发器我希望能够将按钮的背景颜色设置为默认灰色以外的颜色。这是按钮未按下时的样子 alt text

这就是点击它时的样子 alt text

这是按钮的触发器。我知道触发器正在正确触发,因为单击按钮边缘时会产生发光效果。我也知道画笔是正确的,因为我尝试了它作为背景画笔,看看它是什么样的。

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
        </Trigger>
        <!-- This is the trigger which is working but the background color wont change -->
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
        </Trigger>
    </Style.Triggers>  

正如您所看到的,这是整个样式,它是一种适用于整个应用程序中所有按钮的默认样式。

<Style TargetType="Button">
    <Setter Property="Background" Value="{DynamicResource ButtonBrush}" />
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>

这是最终解决方案(感谢所有帮助过的人)

  1. 为通用按钮创建控件模板并执行一些数据绑定:

    <ControlTemplate TargetType ="Button" x:Key="ButtonControlTemplate">
         <Border Background="{TemplateBinding Background}"
                 BorderThickness="{TemplateBinding BorderThickness}"
                 BorderBrush="{TemplateBinding BorderBrush}"
                 CornerRadius="3">
             <Grid>
                 <ContentPresenter ContentSource="{TemplateBinding Content}" 
                                   ContentTemplate="{TemplateBinding ContentTemplate}"
                                   VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
             </Grid>           
         </Border>
    </ControlTemplate>
    
  2. 将控制模板添加到样式:

    <Style TargetType="Button">
        <Setter Property="Background" Value="{DynamicResource ButtonBrush}" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="Template" Value="{DynamicResource ButtonControlTemplate}" />
        <Setter Property="BorderThickness" Value="1" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
                <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
            </Trigger>
        </Style.Triggers>
    </Style>
    
  3. 注意:BorderThickness默认为1,否则它不会显示

1 个答案:

答案 0 :(得分:1)

问题在于windows xp主题luna的默认控件模板。如果您将显示属性中的主题更改为经典,则您的样式将起作用。

应该可以覆盖wpf中的系统颜色,但我无法用该解决方案解决您的问题,可能是颜色被冻结,因此无法更改或用于创建主题特定外观的类,ButtonChrome,已经坏了。

我认为您最好的选择是为按钮制作自己的控件模板。