WPF - 默认按钮禁用样式时应用前景

时间:2013-12-27 07:11:12

标签: wpf

按钮在启用时应用Foreground。如果设置为已禁用,则需要应用默认按钮的已禁用Foreground

<Button Width="150"
        Height="50"
        Content="Test"
        Foreground="Red"
        IsEnabled="False" />

我有这个按钮的触发器,如

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Foreground" Value="#FFADADAD"/>
</Trigger>

启用时,Foreground不会应用。

对此有什么想法吗?

需要如下,

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:11)

如果您在本地设置属性,则触发器将无法更改precedence引起的值。

将Foreground和IsEnabled属性移动到样式中:

<StackPanel>
<StackPanel.Resources>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Foreground" Value="Red"/>
        <Setter Property="IsEnabled" Value="True"/>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="#FFADADAD"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</StackPanel.Resources>
<Button Width="150" 
    Height="50"
    Content="Test">
</Button>

答案 1 :(得分:1)

我不确定我是否正确理解了这个问题,因为有问题的代码应该可以正常使用。以下是生成按钮的工作示例,与捕获的图像完全一致。在这种情况下,我将Style作为资源放在Button的容器控件-StackPanel中:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Foreground" Value="Red"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground" Value="#FFADADAD"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Resources>
    <Button Width="150" 
        Height="50"
        Content="Test"
        IsEnabled="True">
    </Button>
</StackPanel>

答案 2 :(得分:0)

如果您编辑Button的默认模板,您可以在控件模板中找到以下触发器。

  <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" TargetName="border" Value="#FFF4F4F4"/>
                <Setter Property="BorderBrush" TargetName="border" Value="#FFADB2B5"/>
                <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383"/>
            </Trigger>

此触发器使用TargetName将Foreground设置为内容演示者。这里没有使用模板绑定。它直接赋予价值。因此,不会应用您在样式触发器中为前景设置的值。您可以编辑控件模板以满足您的要求。这种限制不仅适用于前景,背景和BorderBrush也有这个限制。

答案 3 :(得分:0)

以下代码对我有用:

<ControlTemplate TargetType="{x:Type ToggleButton}">
     <Grid x:Name="grid" Background="{StaticResource FlatButtonNavigation}">
          <Border Name="ButtonBorder" CornerRadius="5,5,5,5"  
               BorderBrush="Gray" BorderThickness="2">
               <ContentPresenter Name="MyContentPresenter"
               HorizontalAlignment="center"
               RecognizesAccessKey="True"
               SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
               TextBlock.FontSize="{TemplateBinding FontSize}"
               TextBlock.Foreground="{StaticResource LeftPanelFontColor}"
               Margin="10"/>
           </Border>
        </Grid>
        <ControlTemplate.Triggers>
           <Trigger Property="IsEnabled" Value="False">
              <Setter TargetName="ButtonBorder" Property="Background"  Value="LightGray"/>
              <Setter TargetName="ButtonBorder" Property="BorderBrush"  Value="#FFADB2B5"/>
              <Setter TargetName="MyContentPresenter" Property="TextBlock.Foreground" Value="White"></Setter>
           </Trigger>
     </ControlTemplate.Triggers>
</ControlTemplate>