2012-01-04 19 views
6

In uno dei miei progetti ho ereditato un controllo ListView e sovrascritto lo stile impostando un nuovo modello di controllo. Ho anche sostituito lo stile dell'intestazione della colonna. Finora ho trovato due modi per farlo:Impostare lo stile GridViewColumnHeader dall'interno di uno stile ListView

1) Impostando una chiave stile e fa riferimento lo stile nel GridView:

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

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}"> 

2) non impostando una chiave di stile per lo stile di cui sopra. Ora non ho bisogno di fare riferimento allo stile in GridView, ma sovrascrive TUTTE le intestazioni listview nella mia applicazione indipendentemente dal tipo listview.

Poiché utilizzo molte visualizzazioni di elenchi nella mia applicazione, mi piacerebbe farlo in un terzo e più flessibile modo; impostando GridView.ColumnHeaderContainerStyle da uno stile ListView. In questo modo non avrei bisogno di fare riferimento allo stile dell'intestazione in ogni GridView. Ecco una versione semplificata del XAML finora:

<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> 

Questo, purtroppo, non imposta lo stile di intestazione ... Se faccio questa modifica al XAML sopra, funziona:

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}"> 

Qualsiasi idee?

risposta

6

Grazie snurre per avermi indicato nella giusta direzione. Ho trovato un modo per realizzare esattamente quello che volevo.

Non è necessario posizionare la sezione Risorse all'interno di ListView (quel tipo di tag personalizzati per ogni ListView è ciò di cui volevo sbarazzarmi in primo luogo). Le risorse possono invece essere spostate nello stile ListView.

Ecco il codice XAML aggiornato che funziona esattamente il modo in cui voglio che:

<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

Se non è presente alcuna chiave, si applica a tutti gli elementi dello TargetType specificato. Se il vostro stile dispone di una chiave, è necessario utilizzare in modo esplicito:

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

In alternativa, è possibile impostare lo stile all'interno del tuo ListView, in modo che si applica solo a elementi al suo interno:

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