2009-08-20 6 views
35

ho dichiarato uno stile che voglio si applicano a tutti i pulsanti del progetto, lo stile risiede nel ResourceDictionary:Come sovrascrivere uno stile globale (che non ha una chiave x:) o in alternativa applicare uno stile con nome a tutti i controlli con targeting per tipo?

<Style TargetType="StackPanel"> 
    <Setter Property="Orientation" Value="Horizontal" /> 
    <Setter Property="VerticalAlignment" Value="Center"/> 
    <Setter Property="HorizontalAlignment" Value="Center"/> 
</Style> 

Ora, in qualche finestra, voglio ereditare da questo stile, ma aggiungere un valore :

<Style TargetType="StackPanel"> 
    <Setter Property="Margin" Value="5"/> 
</Style> 

il problema è che non eredita dallo stile globale, al fine di ereditare devo assegnare un tasto per lo stile globale:

<Style TargetType="StackPanel" x:Key="StackPanelStyle" /> 

E poi nel ereditare della finestra XAML (e/o di esclusione - optional):

<Style TargetType="StackPanel" BasedOn="StackPanelStyle" /> 

Il problema è che se si assegna un tasto, non è globale e si deve chiamare su ogni finestra/portata.

Una soluzione alla mia domanda dovrebbe essere uno dei due (C'è qualcos'altro che mi manca fuori?):

  1. hanno uno stile globale con una chiave, che viene applicato automaticamente a tutti i suoi controlli mirati nell'intera applicazione.
  2. Un modo per fare riferimento allo stile senza nome ResourceDictionary senza ed eseguirne l'override.

ho pensato a redeclaring gli stili vicino gli stili di nome (nel ResourceDictionary), che funziona realmente:

<!--In the ResourceDictionary--> 
<Style x:Key="StackPanelStyle" TargetType="StackPanel"> 
    <Setter Property="Orientation" Value="Horizontal" /> 
    <Setter Property="VerticalAlignment" Value="Center"/> 
    <Setter Property="HorizontalAlignment" Value="Center"/> 
</Style> 
<!--In the app.xaml--> 
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/> 
<!--In the window/page scope--> 
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/ 

ma cerco per cose meglio di quanto stupidamente ridichiarare tutti gli stili.

risposta

58

Prova questo:

<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}"> 
    <!-- ... --> 
</Style> 

Ho dichiarato il mio stile di base in un ResourceDictionary in App.xaml, se li sovrascrivo in una finestra specifica come questo, di solito funziona.

+0

Grazie amico, è stato breve, veloce e preciso! – Shimmy

+2

Informazioni su questo in Silverlight? – MSNetDev

+0

@MSNetDev Non uso Silverlight, ma per quanto ne so dovrebbe funzionare anche lì. – Botz3000

0

Vorrei suggerire che ciò che si sta cercando qui è uno stile generale o uno scenario di comportamento che viene generalmente ottenuto creando un controllo utente. Se dovessi creare un nuovo controllo a pulsante con il tuo stile 'globale' applicato, allora dovresti usare quel controllo semplicemente aggiungendo 'Nuovi stili o sovrascrivi gli stili se/quando erano necessari.

Se non è stato creato un controllo utente, è facile da implementare.

1

Da qualche parte nel dizionario di risorse globale si definisce uno stile di base con una chiave. Questo stile di base è indirizzato a un tipo che è di base per tutti i tipi per i quali si intende applicare quello stile. Quindi definisci gli stili che hanno come target i tipi che desideri e si basano sullo stile di base sopra menzionato.

<Style 
    x:Key="upDownBaseStyle" 
    TargetType="{x:Type Control}"> 
    <Setter 
     Property="Margin" 
     Value="2" /> 
    <Setter 
     Property="HorizontalAlignment" 
     Value="Stretch" /> 
    <Setter 
     Property="VerticalAlignment" 
     Value="Center" /> 
    </Style> 

    <Style 
    TargetType="{x:Type xceed:IntegerUpDown}" 
    BasedOn="{StaticResource upDownBaseStyle}"> 
    </Style> 

    <Style 
    TargetType="{x:Type xceed:DoubleUpDown}" 
    BasedOn="{StaticResource upDownBaseStyle}"> 
    </Style> 

Ora le ultime due stili vengono applicati a tutti i controlli e IntegerUpDown DoubleUpDown all'interno dell'applicazione, senza alcuna menzione di un tasto.

Quindi la regola di base: lo stile di base deve avere la chiave per riferirsi ad esso, e gli stili derivati ​​potrebbero non essere e quindi possono essere applicati senza alcuna chiave - solo per tipi di destinazione.