2009-11-23 4 views
7

J'utilise le thème standard WPF Aero.NormalColor.xaml. Et ça marche très bien. Cependant, pour l'application entière , je souhaite remplacer la couleur de premier plan des zones de texte par du rouge.Remplacer le thème standard dans App.xaml

Mon premier essai est que

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

Eh bien ... toutes les couleurs de premier plan deviennent rouges textboxes. Cependant, toutes les zones de texte perdent le style de thème. Oui, je sais que je devrais ajouter "BasedOn". Mon deuxième essai consiste à ajouter "BasedOn" dans la balise de style.

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

Une exception est levée. Idem que cela

Finalement, j'atteins mon but par ceci.

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

Et dans toutes les fenêtres et le contrôle de l'utilisateur, je devais définir explicitement

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

Le code ci-dessus est de copier et coller pour de nombreuses fois et il est pas facile Maintenir. Est-ce que quelqu'un sait comment atteindre mon objectif en mettant simplement au premier plan au rouge par une fois?

Répondre

2

Je pense que vous pouvez ajouter le Style à un ResourceDictionary et la fusion que le thème Aero comme ceci:

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

Cela devrait donner toutes vos zones de texte couleur rouge de premier plan sans avoir à spécifier explicitement que sur chaque fenêtre et contrôle de l'utilisateur.

+0

J'ai travaillé pour moi - Merci. – djskinner

+0

J'ai travaillé pour moi - mais vous devriez plutôt placer le style textbox dans un fichier de dictionnaire de ressources séparé (par exemple TextBoxStyles.xaml) et ajouter simplement un au dictionnaire fusionné. Sinon, vous pourriez faire face à un bogue avec les dictionnaires fusionnés résultant dans une situation où le style n'est pas appliqué à la première zone de texte qui est créée ... – Schweder

1

J'ai eu le même problème et j'ai essayé l'approche d'Oskar. Cependant, cela a causé un comportement étrange. En particulier, les styles ne s'appliquaient pas à certains contrôles, tout en s'appliquant à d'autres contrôles du même type. Et je n'ai pas trouvé de différences majeures entre ces contrôles.

Je continue la recherche de la solution et je trouve un ici: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/91718816-8674-4ad8-a3c8-ae283bebe224/

Il est pas encore parfait et clair, mais il fonctionne, du moins pour moi.

En bref, vous pouvez obtenir l'idée du code suivant:

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

Pour la maintenabilité et la lisibilité de ces objets ResourceDictionary imbriqués pourraient aller à séparer les fichiers XAML.

0

La réponse exacte à cette question consiste à définir tout style personnalisé en fonction de la valeur de la ressource statique du contrôle en cours. Toutefois, certains contrôles peuvent ne pas avoir le style par défaut comme ListView ou ListViewItem. Ce style peut localiser n'importe quel type de dictionnaire de ressources comme les ressources de fenêtre, les ressources de grille, les ressources de zone de texte ou le dictionnaire de ressources externe.

Enfin, vous devez ajouter le thème du dictionnaire de ressources aux ressources de votre application, comme le code suivant que j'ajoute au thème Aero de mon application.

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