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

9

当按钮启用时,它会应用 Foreground。如果将其设置为禁用,则需要应用默认按钮的禁用 Foreground

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

我有一些与此按钮相关的触发器,例如

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

启用时未应用此前景

你有任何想法吗?

需要像下面这样,

输入图像描述

输入图像描述


当你最初设置“IsEnabled=False”时,它如何工作? - Vishal
@Sankarann - 根据您的陈述“启用时未应用此前景”,我猜您的意思是这里应该是禁用。 - Rohit Vats
5个回答

16

如果您在本地设置属性,则由于优先级的原因,触发器将无法更改该值。

将前景和启用属性移动到样式中:

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

:这是一个空的段落标签。

2

我不确定我是否正确理解了问题,因为问题中发布的那些代码应该可以正常工作。以下是一个工作示例,可以生成与捕获图像完全相同的按钮。在这种情况下,我将样式作为资源放置在按钮的容器控件-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>

@RohitVats 真的吗?我测试了代码,使用另一个按钮,比如Button2。Button2将切换样式化按钮的IsEnabled属性,而样式正常工作,当IsEnabled = true时显示红色文本,当IsEnabled = false时显示灰色文本。或者我误解了OP实际想要的是什么? - har07
1
我猜他想要除了“灰色”以外的其他颜色,因为灰色是禁用按钮的默认颜色。如果是这种情况,那么他的代码和你的代码都是完美的。 - Rohit Vats
如果您想更改已禁用按钮的颜色,则此方法行不通。灰色是IsEnabled == false的默认颜色,显然已经硬编码到了Button类中。 - CAD bloke

1
以下代码对我有效:

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

1
如果您编辑按钮的默认模板,您可以在控件模板中找到以下触发器。
  <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将前景设置为内容呈现器。这里没有使用模板绑定。它直接分配值。因此,在样式触发器中设置的前景色值将不会应用。您可以编辑控件模板以满足要求。这种限制不仅适用于前景色,也适用于背景和边框刷。


0

可以使用其他答案中提到的样式来工作,但是没有必要在按钮外部定义样式,您可以明确地定义与特定按钮相关的样式:

<Button Width="150" Height="50" Content="Test">
   <Button.Style>
      <Style TargetType="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>
      </Button.Style>
   </Button>
</StackPanel>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接