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

ответ

128

Используйте триггер в стиле изображения. (Естественно было бы поставить его в стиле Button, но стиль Button не может легко повлиять на изображение по досадным техническим причинам. Это можно сделать в контрольной таблице Button Button, но это слишком много для того, что вы хотите здесь.)

<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, которое мы хотим активировать, может не наследоваться Image; в этом случае нам нужно использовать DataTrigger с RelativeSource FindAncestor для привязки к содержащей кнопке.

+1

Великий ответ! Принято и +1 от меня. –

+0

Волшебное решение :). Мне нравится это. – LukTar

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 и не работает. –

+0

@JonePolvora благодарим вас за разъяснение. Я был смущен, почему я не смог извлечь выгоду из этого поста, пока не увидел ваш пост. –

31

Если вы хотите что-то более общий характер, это в вашем разделе ресурсов для вашего окна или UserControl.

<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> 
Смежные вопросы