2010-07-11 10 views
8

Estoy intentando crear un panel de estilo personalizado (StyledStackPanel) que es idéntico al StackPanel normal, que tiene un estilo personalizado. Por ejemplo - si el estilo es simplemente añadir un subrayado, al escribir:Cambio de la plantilla de WPF StackPanel

<StyledStackPanel> 
    <!--User content goes here--> 
</StyledStackPanel> 

Me gustaría recibir el mismo aspecto que si escribía:

<StackPanel> 
    <!--User content goes here--> 
</StackPanel> 
<Border Height="1" BorderBrush="Blue"/> 

Si StackPanel fue un Control, Podría haber reemplazado el DataTemplate de ese control. Sin embargo, hereda Panel que hereda FrameworkElement.
¿Hay alguna manera de cambiar la plantilla de un StackPanel?

Respuesta

6

No hay manera de establecer un ControlTemplate de un panel, pero usted tiene varias opciones:

  1. Crea una alfombrilla/control de usuario que tiene el StackPanel como un niño.

  2. Heredar del StackPanel y anular OnRender llamar su estilo personalizado (también puede ser necesario para anular MeasureOverride y ArrangeOverride añadir un poco de espacio alrededor de los niños del panel para su dibujo.

  3. Heredar directamente desde el panel y anulación OnRender, MeasureCore y ArrangeCore: si necesita usar el panel de una manera específica y no necesita todas las opciones de StackPanel, esta es la forma más sencilla ya que el algoritmo de diseño de StackPanel es simple.

  4. Heredar de Decorator (si usted hace su dibujo en código) o ContentControl (si desea usar ControlTemplate) y wa rp su panel con él cuando lo utiliza:

     <l:PanelStyle> 
         <StackPanel> .. <StackPanel> 
        </l:PanelStyle> 
    
  5. Escribir el estilo de ItemsControl, ItemsControl tiene una ControlTemplate que puede establecer y básicamente envuelve un panel (por defecto es un StackPanel vertical).

Me gustaría ir con la opción 4 si necesita acceder a las propiedades de StackPanel o 5 si no lo hace.

+0

6 años después ... lo siento. ¿Sería posible incluir una breve demostración de la opción 4? – matrixugly

1

Debe hacer un control personalizado normal que agregue sus elementos secundarios a un StackPanel interno.

Por ejemplo:

[ContentProperty("Children")] 
public class StyledStackPanel : UserControl { 
    public UIElementCollection Children { get { return stackPanel.Children; } } 
} 

(no probado)

+3

El problema aquí es que todas las propiedades de StackPanel que se desean deben reconectarse. ¿Existe una solución más simple? ¿Ayudaría derivar de StackPanel y luego hacer estilos adicionales con un adorno? – HCL

Cuestiones relacionadas