2010-03-27 144 views
46

我有一个简单Button控制包含一个Image对象作为其内容。我想这样设置Image不透明度为0.5时Button被禁用,以提供一个额外的视觉提示Button状态。'灰色'WPF按钮图像?

什么是实现这一结果在XAML最简单的方法?谢谢你的帮助。

+0

不能做这样的工作。这为我工作: http://stackoverflow.com/questions/4532943/icommand-canexecute-can-not-disable-button-with-image-content/11126571#11126571 – aeinstein 2012-06-20 19:32:06

回答

128

在图像样式中使用触发器。 (将它放在按钮样式中会更自然,但Button样式不会因为令人讨厌的技术原因而轻易影响图像,它可以在Button的ControlTemplate中完成,但这对于您在此处想要的操作来说是过度的)。

<Button> 
    <Image Source="something.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
     <Style.Triggers> 
      <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Opacity" Value="0.5" /> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </Image.Style> 
    </Image> 
</Button> 

注意我们正在采取的事实的优点在这里,当按钮被禁用的图像将被禁用,所以我们可以直接对图像自身的IsEnabled属性触发。在其他情况下,我们想要触发的Button属性可能不会被图像继承;在这种情况下,我们需要使用具有FindAncestor RelativeSource的DataTrigger绑定到包含按钮。

+1

伟大的答案!接受并从我+1。 – 2010-03-28 01:23:55

+0

魔术解决方案:)。我喜欢。 – LukTar 2016-11-07 15:56:38

16

这里有一个更通用的风格,你可以申请:

<Style TargetType="Button"> 
    <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> 
+1

请注意,这仅适用于图像是按钮的直接子项。在我的情况下,按钮内容由StackPanel包装,并没有奏效。 – 2015-03-23 01:41:59

+0

@JonePolvora谢谢你澄清。我很困惑,为什么我没有从这篇文章中受益,直到我看到你的帖子。 – 2015-12-29 22:13:33

31

如果你想要的东西更通用的,把这个在你的资源节你的窗口或用户控件。

<UserControl.Resources>  
    <Style x:Key="ImageEnabled" TargetType="Image"> 
     <Style.Triggers> 
      <Trigger Property="IsEnabled" Value="False"> 
       <Setter Property="Opacity" Value="0.25"></Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

而且在实际的按钮只是这样做

<Button> 
    <Image Source="{StaticResource LinkImage}" Style="{StaticResource ImageEnabled}"/> 
</Button>