Como ligar ControlTemplate propriedade Enabled como opacidade em WPF XAML
-
16-09-2019 - |
Pergunta
Em WPF dentro de XAML como estender um ControlTemplate como tal que, quando aplicado a um botão e o botão fica deficientes desvanece-se a 0,5 opacidade enquanto se desvanece com deficiência e uma vez habilitado voltar a 1,0 opacidade.
Este efeito visual deve funcionar também quando um pai está sendo desativado.
Solução
Você não precisa de um ControlTemplate para isso. Você pode fazer isso com apenas estilos. O seguinte botão estilo é aplicado a todos os botões. Ele define opacidade para 0,5 quando IsEnabled é verdadeiro e retorna para 1 automaticamente quando a condição de disparo não se aplicam mais. Se você estiver aplicando o ControlTemplate em um estilo, você pode adicionar este gatilho para aquele. Ele também funciona quando o pai está desativado desde IsEnabled é herdada.
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Control.IsEnabled" Value="false">
<Setter Property="Control.Opacity" Value="0.5" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
Ou você exigem especificamente uma solução ControlTemplate?
Atualizar
Eu não acho que TemplateBinding suporta Converter então se você quiser fazer isso no ControlTemplate você precisa usar algo como o seguinte ligação declaração suficientemente alta na árvore lógica.
Opacity={Binding Path=IsEnabled,
RelativeSource={RelativeSource TemplatedParent},
Converter={StaticResource BoolToDoubleConverter}}
Onde BoolToDoubleConverter é um IValueConverter que retorna 1 para verdadeiro e 0,5 para falsa. Eu ainda recomendo a abordagem estilo se você pode usar estilos. Muito mais simples que eu acredito.