none
Modificar el Style de un CustomControl sin tocar el Template RRS feed

  • Pregunta

  • Buenas compañeros desarrolladores.

    Antes que nada, no se si he elegido bien la categoría para esta pregunta, porque mi aplicación es WPF desarrollada en C#, si me he equivocado disculpad las molestias.

    Y ahora mi pregunta:

    He creado un CustomControl derivado de TextBox en un proyecto de Biblioteca de clases.

    A la hora de definir su estilo, tengo un archivo Generic.xaml en el que setteo las propiedades que me interesan:

    <Style TargetType="{x:Type local:MyCustomControl}">
     <Setter Property="Background" Value="Aquamarine"/>
     <Setter Property="FontSize" Value="24"/>
    </Style>
    

    He leido por ahi que tengo que aplicar esto en el constructor de mi custom control para que tome el estilo:

     

    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));

     

    Pero según he visto, esto me obliga a definir un Template en el Generic.xaml, y esto es lo que quiero evitar.

    Hay alguna manera de decirle directamente al CustomControl de que archivo tiene que coger su Style, o alguna manera de decirle al Setter del Template que coja el template por defecto del control base?

    Espero haberme explicado bien, gracias de antemano.

    Saludos, Isaac R.F.

    miércoles, 9 de febrero de 2011 7:31

Respuestas

  • Hola!

    No es necesario crear un Template, en el constructor de tu control, indicale cual es el estilo por defecto:

    public MyCustomControl()
    {
      // Get the style from generic.xaml
      this.DefaultStyleKey = typeof(MyCustomControl);
    }
    

    Con esto debería recoger el estilo automáticamente.

    Un saludo, espero que te funcione!

     


    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
    • Marcado como respuesta IsaacRF239 jueves, 10 de febrero de 2011 12:01
    miércoles, 9 de febrero de 2011 9:12
    Moderador
  • Hola Isaac,

    Tienes razón, pero es que un CustomControl no tiene aspecto (template) por defecto, debes tu indicarle una template siempre. Es algo obligatorio.

    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
    • Marcado como respuesta IsaacRF239 jueves, 10 de febrero de 2011 12:02
    jueves, 10 de febrero de 2011 11:33
    Moderador

Todas las respuestas

  • Hola!

    No es necesario crear un Template, en el constructor de tu control, indicale cual es el estilo por defecto:

    public MyCustomControl()
    {
      // Get the style from generic.xaml
      this.DefaultStyleKey = typeof(MyCustomControl);
    }
    

    Con esto debería recoger el estilo automáticamente.

    Un saludo, espero que te funcione!

     


    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
    • Marcado como respuesta IsaacRF239 jueves, 10 de febrero de 2011 12:01
    miércoles, 9 de febrero de 2011 9:12
    Moderador
  • Buenas y gracias por responder.

    He puesto en el constructor del control la línea que me has dicho, y al ejecutar la aplicación el control no se ve, a menos que defina un Template en el Style del Generic.xaml en un Setter:

    <Style TargetType="{x:Type local:MyCustomControl}">
      <Setter Property="Background" Value="Aquamarine"/>
      <Setter Property="FontSize" Value="24"/> 
      <Setter Property="Template">
       <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
         <Border Background="Aquamarine" BorderThickness="2">
          <Decorator x:Name="PART_ContentHost"/>
         </Border>
        </ControlTemplate>
       </Setter.Value>
      </Setter>
    </Style>
    

    Asi si que se ve el control, pero esto es precisamente lo que quiero evitar, definir un Template.

    ¿Alguna otra idea compañeros?

     

    Gracias de antemano y saludos, Isaac R.F.

    miércoles, 9 de febrero de 2011 9:49
  • Hola Isaac,

    Tienes razón, pero es que un CustomControl no tiene aspecto (template) por defecto, debes tu indicarle una template siempre. Es algo obligatorio.

    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
    • Marcado como respuesta IsaacRF239 jueves, 10 de febrero de 2011 12:02
    jueves, 10 de febrero de 2011 11:33
    Moderador
  • Buenas Yeray.

    Ya veo... bueno al menos siempre tengo la opción de copiar la plantilla por defecto del control que me interese usando algún programa como Expression Blend.

    Muchas gracias por la ayuda compañero.
    jueves, 10 de febrero de 2011 12:01
  • Hola Isaac, yo también tuve el mismo problema, tenía un control del cual herede y quería conservar su template intacto, solo agregar funcionalidad adicional. Pues bien después de buscar y buscar he encontrado la solución, que esta en utilizar el atributo baseOn.

    A continuación te detallo como se debe utilizar el ejemplo asume que estas heredando de un combobox.

     

    <Style TargetType="{x:Type local:CustomControl1}"
           
    BasedOn="{StaticResource {x:Type ComboBox}}">
    </Style>

     

    Saludos, y aunque el post es un poco viejo espero que te sirva, o a otros les sirva.

    viernes, 8 de julio de 2011 20:53