none
Ayuda con la propiedad Effect RRS feed

  • Pregunta

  • Tengo una plantilla para un botón a la cual quiero aplicarle el efecto de sombras (con Effect) y necesito que tome el color de fondo del botón. Le asigno esto a través de TemplateBinding Background que se supone que debe tomar el color de fondo que le aplique. Este es mi código XAML:

    <ControlTemplate x:Key="BotonBase" TargetType="Button">
    	<Grid>
    		<Border x:Name="Borde" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
    			<Rectangle x:Name="Rectangulo" Fill="{TemplateBinding Background}" />
    		</Border>
    		<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
    	</Grid>
    	<ControlTemplate.Triggers>
    		<Trigger Property="IsPressed" Value="True">
    			<Setter TargetName="Rectangulo" Property="Effect">
    				<Setter.Value> <!--AQUÍ ESTÁ EL PROBLEMA-->
    					<DropShadowEffect Direction="0" Color="{TemplateBinding Background}" Opacity="0.6" BlurRadius="20" ShadowDepth="0" />
    				</Setter.Value>
    			</Setter>
    		</Trigger>
    	</ControlTemplate.Triggers>
    </ControlTemplate>
    	
    <Style TargetType="Button">
    	<Setter Property="OverridesDefaultStyle" Value="True" />
    	<Setter Property="SnapsToDevicePixels" Value="True" />
    	<Setter Property="VerticalAlignment" Value="Top" />
    	<Setter Property="HorizontalAlignment" Value="Left" />
    	<Setter Property="Width" Value="106" />
    	<Setter Property="Height" Value="38" />
    	<Setter Property="FontSize" Value="18" />
    	<Setter Property="Foreground" Value="White" />
    	<Setter Property="Template" Value="{StaticResource ResourceKey=BotonBase}" />
    </Style>

    Al presionar el botón me aparece un color distinto en la sombra, sale de color gris; pero si le aplico el color directamente no da problemas. ¿Cómo le hago para resolver esto?

    Aplicado con TemplateBinding

    Ese es el color que no debería aparecer.


    Colores correctos, pero aplicado directamente sin usar ningún tipo de Binding.


    El que ama lo que hace está benditamente condenado al éxito, que llegará cuando deba llegar.


    • Editado noexisto007 sábado, 26 de mayo de 2012 17:21 Información adicional
    sábado, 26 de mayo de 2012 6:20

Respuestas

  • Hola amarante.

    Si, la clase DropShadowEffect, hereda de DependencyObject y por ello veras que la propiedad Color es una propiedad de dependencia que puede implementar cualquier clase que herede de DependencyObject. 

    No obstante toda la funcionalidad del binding sobretodo en enlace a recursos es implementada por la clase FrameworkElement, de modo que como DropShadowEffect no hereda de ella no puede usar toda la funcionalidad de los bindings.

    Pero como existen algunas alternativas, puedes usar alguna de sus variantes que consiste en hacer un binding a un elemento relativo como estas 2:

    <DropShadowEffect Direction="0" Color="{Binding Path=Fill.Color, RelativeSource={RelativeSource FindAncestor, AncestorType=Rectangle}}" Opacity="0.6" BlurRadius="20" ShadowDepth="0" />
    <DropShadowEffect Direction="0" Color="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}}" Opacity="0.6" BlurRadius="20" ShadowDepth="0" />
                                

    Estas 2 deberian de funcionarte correctamente


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    • Marcado como respuesta noexisto007 lunes, 28 de mayo de 2012 23:41
    lunes, 28 de mayo de 2012 15:12

Todas las respuestas

  • Hola amarante.

    Si, la clase DropShadowEffect, hereda de DependencyObject y por ello veras que la propiedad Color es una propiedad de dependencia que puede implementar cualquier clase que herede de DependencyObject. 

    No obstante toda la funcionalidad del binding sobretodo en enlace a recursos es implementada por la clase FrameworkElement, de modo que como DropShadowEffect no hereda de ella no puede usar toda la funcionalidad de los bindings.

    Pero como existen algunas alternativas, puedes usar alguna de sus variantes que consiste en hacer un binding a un elemento relativo como estas 2:

    <DropShadowEffect Direction="0" Color="{Binding Path=Fill.Color, RelativeSource={RelativeSource FindAncestor, AncestorType=Rectangle}}" Opacity="0.6" BlurRadius="20" ShadowDepth="0" />
    <DropShadowEffect Direction="0" Color="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}}" Opacity="0.6" BlurRadius="20" ShadowDepth="0" />
                                

    Estas 2 deberian de funcionarte correctamente


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    • Marcado como respuesta noexisto007 lunes, 28 de mayo de 2012 23:41
    lunes, 28 de mayo de 2012 15:12
  • Mil gracias. :D

    El que ama lo que hace está benditamente condenado al éxito, que llegará cuando deba llegar.

    lunes, 28 de mayo de 2012 23:42