2012-01-04 9 views
6

En uno de mis proyectos, he heredado un ListView y he anulado el estilo estableciendo una nueva plantilla de control. También he anulado el estilo del encabezado de la columna. Hasta ahora he encontrado dos maneras de hacer esto:Establecer el estilo GridViewColumnHeader desde dentro de un estilo ListView

1) Al establecer una clave de estilo y haciendo referencia al estilo en el GridView:

<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle"> 
    <Setter Property="Background" Value="Wheat" /> 
</Style> 

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}"> 

2) Al no establecer una clave de estilo para el estilo anterior. Ahora no necesito hacer referencia al estilo en GridView, PERO también reemplaza TODOS los encabezados de lista de mi aplicación independientemente del tipo de vista de lista.

Dado que uso muchas listas de vista en mi aplicación, me gustaría lograr esto de una tercera y más flexible manera; configurando GridView.ColumnHeaderContainerStyle desde dentro de un estilo ListView. De esa forma no necesitaría hacer referencia al estilo de encabezado en cada GridView. Aquí es una versión simplificada de la XAML hasta ahora:

<Window.Resources> 
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle"> 
     <Setter Property="Background" Value="Wheat" /> 
    </Style> 

    <Style TargetType="{x:Type list:MyListView}"> 
     <Setter Property="GridView.ColumnHeaderContainerStyle" Value="{StaticResource MyHeaderStyle}" />    
     <Setter Property="Background" Value="Linen" />         
    </Style> 
</Window.Resources> 

<list:MyListView> 
    <list:MyListView.View> 
     <GridView> 
      <GridViewColumn Header="Column1" /> 
      <GridViewColumn Header="Column2" /> 
     </GridView> 
    </list:MyListView.View> 
</list:MyListView> 

Esto, desafortunadamente, no establece el estilo de cabecera ... Si hago este cambio en el XAML anterior, funciona:

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}"> 

Cualquier ideas?

Respuesta

6

Gracias snurre por señalarme en la dirección correcta. Encontré una manera de lograr exactamente lo que quería.

No necesita colocar la sección de Recursos dentro de ListView (ese tipo de etiquetas personalizadas para cada ListView es lo que quería deshacerse en primer lugar). Los recursos se pueden mover al estilo ListView en su lugar.

Aquí es el XAML actualizado que funciona exactamente de la manera que yo quiero que:

<Window.Resources> 
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle"> 
     <Setter Property="Background" Value="Wheat" /> 
    </Style> 

    <Style TargetType="{x:Type list:MyListView}"> 
     <Style.Resources> 
      <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource MyHeaderStyle}" /> 
     </Style.Resources> 

     <Setter Property="Background" Value="Linen" />         
    </Style> 
</Window.Resources> 

<list:MyListView> 
    <list:MyListView.View> 
     <GridView> 
      <GridViewColumn Header="Column1" x:Name="col1" /> 
      <GridViewColumn Header="Column2" x:Name="col2" /> 
     </GridView> 
    </list:MyListView.View> 
</list:MyListView> 
3

Si no hay una clave, se aplica a todos los elementos del TargetType especificado. Si su estilo tiene una clave, usted tiene que utilizar explícitamente:

<GridViewColumn HeaderContainerStyle="{StaticResource MyHeaderStyle}" Header="Column1"/> 

Como alternativa, se puede establecer el estilo dentro de su ListView, por lo que sólo se aplica a los elementos de su interior:

<list:MyListView> 
    <list:MyListView.Resources> 
     <Style TargetType="{x:Type GridViewColumnHeader}"> 
      <Setter Property="Background" Value="Wheat" /> 
     </Style> 
    </list:MyListView.Resources> 
</list:MyListView> 
Cuestiones relacionadas