2009-11-23 4 views
7

Sto utilizzando il tema standard WPF Aero.NormalColor.xaml. E funziona molto bene. Tuttavia, per l'intera applicazione , desidero sovrascrivere il colore di primo piano delle caselle di testo in rosso.Sovrascrivi tema standard in App.xaml

Il mio primo tentativo è che

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="/PresentationFramework.Aero, Version=3.0.0.0, 
       Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
       ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="TextBox"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
    </ResourceDictionary> 
</Application.Resources> 

Beh ... tutto colore di primo piano di caselle di testo diventano rosso. Tuttavia, tutte le caselle di testo perdono lo stile del tema. Sì, so che dovrei aggiungere "BasedOn". Il mio secondo tentativo è aggiungere "BasedOn" nel tag di stile.

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="/PresentationFramework.Aero, Version=3.0.0.0, 
       Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
       ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
    </ResourceDictionary> 
</Application.Resources> 

Viene generata l'eccezione. Come questo WPF : Extend Theme's style - StackOverflowException

Alla fine, raggiungo il mio obiettivo.

In App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="/PresentationFramework.Aero, Version=3.0.0.0, 
       Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
       ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

E in tutte le finestre e il controllo dell'utente, ho dovuto impostare in modo esplicito

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 
</UserControl.Resources> 

Il codice di cui sopra è copiare e incollare per molte volte e non è facile mantenere. Qualcuno sa come raggiungere il mio obiettivo semplicemente impostando il primo piano su rosso entro il una volta?

risposta

2

Penso che si possa aggiungere il Style ad un ResourceDictionary e la fusione che con il tema Aero in questo modo:

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
     ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
     </ResourceDictionary> 

     <!-- Adding the style to a resource dictionary --> 
     <ResourceDictionary> 
     <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
     </ResourceDictionary> 

    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Questo dovrebbe dare a tutti i tuoi caselle di testo colore di primo piano rosso senza dover specificare esplicitamente che su ogni finestra e controllo dell'utente.

+0

Ha funzionato per me - Grazie. – djskinner

+0

Ho lavorato per me - ma dovresti posizionare meglio lo stile della casella di testo in un file del dizionario delle risorse separato (ad esempio TextBoxStyles.xaml) e aggiungere un al dizionario unito. Altrimenti, potresti trovarti di fronte a un bug con i dizionari uniti risultante in una situazione in cui lo stile non è applicato alla prima casella di testo che viene creata ... – Schweder

1

Ho avuto lo stesso problema e ho provato l'approccio di Oskar. Tuttavia, ha causato un comportamento strano. In particolare, gli stili non si applicavano ad alcuni controlli, mentre si applica ad altri controlli dello stesso tipo. E non sono riuscito a trovare grandi differenze tra questi controlli.

ho continuato a cercare la soluzione e ho trovato uno qui: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/91718816-8674-4ad8-a3c8-ae283bebe224/

Non è ancora perfetto e chiaro, ma funziona, almeno per me.

In breve, è possibile ottenere l'idea da seguente codice:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
     ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml" /> 
       </ResourceDictionary.MergedDictionaries> 
       <Style x:Key="ExtendedTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
        <Setter Property="Foreground" Value="Red" /> 
       </Style> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ExtendedTextBoxStyle}" /> 
    </ResourceDictionary> 
</Application.Resources> 

Per la manutenibilità e la leggibilità questi oggetti ResourceDictionary nidificati potevano andare a separare i file XAML.

0

La risposta esatta per questa domanda è l'impostazione di tutto lo stile personalizzato in base al valore della risorsa statica del controllo corrente. Tuttavia, alcuni controlli potrebbero non avere uno stile predefinito come ListView o ListViewItem.

<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Setter Property="Width" Value="250" /> 
    <Setter Property="Height" Value="25" /> 
</Style> 

Questo stile può trovare in nessun dizionario tipo risorsa come le risorse di finestra, le risorse di rete, le risorse TextBox o dizionario risorsa esterna.

Infine, è necessario aggiungere il tema del dizionario risorse alle risorse dell'applicazione come il seguente codice che aggiungo il tema Aero alla mia applicazione.

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/PresentationFramework.Aero, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> 
      <ResourceDictionary Source="/Themes/Default.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources>