none
No funcionan mis estilos y plantillas en wpf 4 RRS feed

  • Pregunta

  • Tengo un estilo para botones que utiliza un trigger que le da un efecto de borde dorado cuanto se lo señala con el mouse, esto funciona muy bien en wpf 3.5 pero cuando lo pase a wpf 4 el trigger no funciona.

    El primer problema que tube es que el formulario de wpf 4 no reconocia a mi estilo, asi que tube que referenciarlo de la siguiente manera:

    <Window.Resources>
        <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Estilos/Botones.xaml">
              
            </ResourceDictionary>
          </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
      <Grid Background="white" Height="auto" Width="auto" >
        <Button Style="{StaticResource BotonNormal}" Content="Button" Height="23" Width="75" />
      </Grid>

    El estilo que estoy usando es el siguiente y esta en una plantilla de tipo ResourceDictionary llamada Botones:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      
      <Style x:Key="BotonNormal" TargetType="{x:Type Button}">
        <Style.Triggers>
          <MultiTrigger>
            <MultiTrigger.Conditions>
              <Condition Property="IsMouseOver" Value="True"/>
              <Condition Property="IsEnabled" Value="True"/>
            </MultiTrigger.Conditions>
    
            <Setter Property="BitmapEffect">
              <Setter.Value>
                <OuterGlowBitmapEffect GlowColor="Gold" GlowSize="20" />
    
              </Setter.Value>
            </Setter>
    
          </MultiTrigger>
        </Style.Triggers>
      </Style>
    
    </ResourceDictionary>

    No me salen errores ni advertencias pero el estilo nose aplica al boton.

    Nose por que pasa esto no es logico para mi ya que este mismo estilo lo aplico en wpf3.5 y funciona de maravilla.

    Tambien he probado con templates que tengo en wpf 3.5 y tampoco funcionan. Porfavor que alguien me explique!

    jueves, 26 de mayo de 2011 4:37

Todas las respuestas

  • Hola!

    En .NET 4 OuterGlowBitmapEffect es obsoleto y no funciona, se mantiene por motivos de compatibilidad con .NET 3.5.

    Para realizar este efecto, puedes usar DropShadowBitmapEffect, sustituye la línea de <OuterGlowBitmapEffect..... /> por esta:

    <DropShadowBitmapEffect ShadowDepth="0" Color="Gold" Softness="20"></DropShadowBitmapEffect>
    

    El efecto tiene la misma apariencia. El truco está en establecer el shadowdepth a 0 para que no tenga sensación de profundidad ni desplazamiento de perspectiva la sombra.

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    jueves, 26 de mayo de 2011 7:01
    Moderador
  • Saludos Josue.

    Tenias razon al respecto de que el OuterGlowBitmapEffect esta obsoleto cambie por la linea de codigo que me diste y funciono aunque no con la misma calidad.

    Tengo un Template al cual tambien le cambie esa propiedad, utilizo el mismo efecto de contorno para las imagenes y texto que tengo dentro del boton y aparentemente funciona, solo que la sombra de fondo se ve muy debil.

    El otro problema que tengo es que la imagen que esta dentro el boton se ve muy rustica y no tan nitida (en wpf 3.5 la imagen se mostraba nitida y suave) talvez algunas de las propiedades que utilizo en este template tambien esta obsoleto por favor te pido que le heches un vistaso a mi codigo y me ayudes a mejorar la apariencia de la imagen.

    <ControlTemplate x:Key="BotonMenus" TargetType="{x:Type Button}">
        <ControlTemplate.Resources>
          <Storyboard x:Key="OnMouseEnterBtn">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="(UIElement.BitmapEffect).(DropShadowBitmapEffect.Opacity)">
              <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
          </Storyboard>
          <Storyboard x:Key="OnMouseLeaveBtn">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="(UIElement.BitmapEffect).(DropShadowBitmapEffect.Opacity)">
              <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
          </Storyboard>
        </ControlTemplate.Resources>
        <ContentPresenter x:Name="contentPresenter" Width="Auto" Height="Auto" RenderTransformOrigin="0.5,0.5" Cursor="Hand" >
          <ContentPresenter.BitmapEffect>
            <!--<OuterGlowBitmapEffect GlowColor="#FFE2EBFB" GlowSize="11" Opacity="0"/>-->
            <DropShadowBitmapEffect ShadowDepth="0" Color="#FFE2EBFB" Softness="20" Opacity="0" ></DropShadowBitmapEffect>
    
          </ContentPresenter.BitmapEffect>
          <ContentPresenter.RenderTransform>
            <TransformGroup>
              <ScaleTransform ScaleX="1" ScaleY="1"/>
              <SkewTransform AngleX="0" AngleY="0"/>
              <RotateTransform Angle="0"/>
              <TranslateTransform X="0" Y="0"/>
            </TransformGroup>
          </ContentPresenter.RenderTransform>
        </ContentPresenter>
        <ControlTemplate.Triggers>
          <EventTrigger RoutedEvent="Mouse.MouseLeave">
            <BeginStoryboard x:Name="OnMouseLeaveBtn_BeginStoryboard" Storyboard="{StaticResource OnMouseLeaveBtn}"/>
          </EventTrigger>
          <EventTrigger RoutedEvent="Mouse.MouseEnter">
            <BeginStoryboard Storyboard="{StaticResource OnMouseEnterBtn}"/>
          </EventTrigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>

    Te agradecere bastante tu ayuda

    Atentamente: Limber

    jueves, 26 de mayo de 2011 13:51