2010-03-27 173 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>