WPF按钮背景在IsEnabled = False时

3

我试图在按钮不可用时为其设置样式,使背景 LinearGradientBrush 与启用时设置的按钮相似。我尝试使用 Triggers,但似乎只有文本颜色会改变:

<Application x:Class="RSPolar.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <!--Windows style-->
        <Style TargetType="Window">

            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                        <GradientStop Color="Gray" Offset="1" />
                        <GradientStop Color="DarkGray" Offset="0.92" />
                        <GradientStop Color="Gray" Offset="0.9" />
                        <GradientStop Color="LightGray" Offset="0.88" />
                        <GradientStop Color="WhiteSmoke" Offset="0" />
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Style>
        <!--Buttons style-->
        <Style TargetType="Button">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <TextBlock FontWeight="Bold" FontSize="48" Foreground="#00FF00" Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType={x:Type Button}}}">
                            <TextBlock.Effect>
                                <DropShadowEffect BlurRadius="1" Color="DarkGray" ShadowDepth="1" Direction="120"/>
                            </TextBlock.Effect>
                        </TextBlock>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                        <GradientStop Color="Gray" Offset="1" />
                        <GradientStop Color="DarkGray" Offset="0.52" />
                        <GradientStop Color="Gray" Offset="0.5" />
                        <GradientStop Color="LightGray" Offset="0.48" />
                        <GradientStop Color="WhiteSmoke" Offset="0" />
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Button.Effect">
                <Setter.Value>
                    <DropShadowEffect Color="Black" Direction="320" ShadowDepth="5" BlurRadius="10" Opacity="0.5" />
                </Setter.Value>
            </Setter>
            <Setter Property="Button.Effect">
                <Setter.Value>
                    <BlurEffect Radius="1"></BlurEffect>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <TextBlock FontWeight="Bold" FontSize="48" Foreground="#FF0000" Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType={x:Type Button}}}">
                                    <TextBlock.Effect>
                                        <DropShadowEffect BlurRadius="1" Color="DarkGray" ShadowDepth="1" Direction="120"/>
                                    </TextBlock.Effect>
                                </TextBlock>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Background">
                        <Setter.Value>
                            <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                                <GradientStop Color="Gray" Offset="1" />
                                <GradientStop Color="DarkGray" Offset="0.52" />
                                <GradientStop Color="Gray" Offset="0.5" />
                                <GradientStop Color="LightGray" Offset="0.48" />
                                <GradientStop Color="WhiteSmoke" Offset="0" />
                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Application.Resources>
</Application>

你到底想要什么?你想为按钮的启用和禁用状态设置不同的背景吗?根据你为按钮创建的样式,无论是启用还是禁用状态,按钮的背景都是相同的。只有ContentTemplate不同,因此文本颜色会发生变化。如果你想在按钮被禁用时改变背景,请在触发器中提供不同的背景。 - Nitin Joshi
这就是我所做的。代码结尾是新的背景颜色(此时相同),但背景是未激活按钮的默认背景。 - Fleve
1个回答

9

您不应该定义ContentTemplate属性。如果您想要更改按钮的外观,您应该定义Template属性,并将您的Trigger添加到您在那里定义的ControlTemplate中。

如果您阅读MSDN上的通过创建ControlTemplate自定义现有控件的外观页面可能会有所帮助。您还可以在MSDN上的ControlTemplate Class页面找到使用ControlTemplate.Triggers的示例。

但是,这里是一个简单的示例:

Resources中:

<ControlTemplate x:Key="ExampleButton" TargetType="{x:Type Button}">
    <Border Background="LightGreen" BorderBrush="Black" BorderThickness="1" 
        CornerRadius="5" x:Name="Border" Padding="10">
        <ContentPresenter />    
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="Border" Property="Background" Value="LightBlue" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

在XAML页面中:
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <Button Template="{StaticResource ExampleButton}" Content="Click me" />
    <Button Template="{StaticResource ExampleButton}" Content="Click me" 
        IsEnabled="False" />
</StackPanel>

更新 >>>

您只需要将“普通”Background值替换为您在示例中使用的LinearGradientBrush

资源中:

<ControlTemplate x:Key="ExampleButton" TargetType="{x:Type Button}">
    <Border BorderBrush="Black" BorderThickness="1" 
        CornerRadius="5" x:Name="Border" Padding="10">
        <Border.Background>
            <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                <GradientStop Color="Gray" Offset="1" />
                <GradientStop Color="DarkGray" Offset="0.52" />
                <GradientStop Color="Gray" Offset="0.5" />
                <GradientStop Color="LightGray" Offset="0.48" />
                <GradientStop Color="WhiteSmoke" Offset="0" />
            </LinearGradientBrush>
        </Border.Background>
        <ContentPresenter />
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="Border" Property="Background">
                <Setter.Value>
                    <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">
                        <GradientStop Color="Gray" Offset="1" />
                        <GradientStop Color="DarkGray" Offset="0.52" />
                        <GradientStop Color="Gray" Offset="0.5" />
                        <GradientStop Color="LightGray" Offset="0.48" />
                        <GradientStop Color="WhiteSmoke" Offset="0" />
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

为什么目标边框会设置按钮背景颜色?它不应该改变边框的颜色吗?

ButtonBackground 实际上就是边框的 Background


这个例子是可以工作的,但我仍然无法做到我想要的:在IsEnabled的两种状态下都有渐变效果。使用你的例子,我可以创建一个相同颜色的“平面”背景,但没有渐变效果。 为什么目标边框设置按钮的背景颜色?它不应该改变边框的颜色吗? - Fleve
正如我所说,我提供了一个简单的例子。你应该能够用你自己的渐变替换上面的“Background”值...就像你的例子一样。 - Sheridan

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