如何在wpf中设置图片背景

how to set image background in wpf

我正在尝试将非活动按钮设置为具有半透明(即变灰)图像。然而由于某种原因,图像变成了白色/黄色(就像在明亮的背景上一样):

As you can see it's light yellow

Possibly better annotated screenshot

以下是 XAML 样式:

 <Style x:Key="ToolButton" TargetType="{x:Type Button}" BasedOn="{x:Null}">
    <Setter Property="Background" Value="#888"/>
    <Setter Property="Padding" Value="10,2"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Style.Resources>
        <Style TargetType="Image">
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Opacity" Value="0.5"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Style.Resources>
</Style>

<Style x:Key="ToolPanel" TargetType="{x:Type StackPanel}">
    <Setter Property="Background" Value="#111"/>
    <Style.Resources>
        <Style TargetType="{x:Type Button}" BasedOn="{StaticResource ResourceKey=ToolButton}"/>
    </Style.Resources>
</Style>

(StackPanel和按钮是深色对比,实际上是浅灰色)

我应该怎么做才能得到我想要的灰色效果?

问题是默认的 Button 模板:它根据控件的状态更改其背景,并且新背景优先于您在样式中设置的背景。

在这种情况下,'Disabled' 状态的画笔类似于 #F4F4F4,或者是非常浅的灰色。

解决方法是声明一个新的 Button 模板。例如:

<ControlTemplate TargetType="Button">
  <!--Optional: Add border brush/thickness if you want a border-->
  <Border x:Name="border" Background="{TemplateBinding Background}">
    <ContentPresenter x:Name="contentSite" Margin="{TemplateBinding Padding}" />
  </Border>
  <ControlTemplate.Triggers>
    <Trigger Property="IsEnabled" Value="False">
      <!--Optional: Remove background when disabled-->
      <!--Setter TargetName="border" Property="Background" Value="Transparent" /-->
      <Setter TargetName="contentSite" Property="Opacity" Value="0.5" />
    </Trigger>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter TargetName="border" Property="Background" Value="#AAA" />
    </Trigger>
    <Trigger Property="IsPressed" Value="True">
      <Setter TargetName="border" Property="Background" Value="#333" />
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

请注意,使用此版本,您不需要 Image 样式来更改 Opacity;它在 Button 模板中得到处理。