2010-06-29 12 views
58

Je veux être en mesure de définir une famille de polices pour mon application WPF. De préférence, utiliser un dictionnaire de ressources en tant que thème référencé par App.xaml. Je l'ai essayé de créer un Style comme suit:Comment définir la police par défaut pour une application WPF?

<Style TargetType="{x:Type Control}"> 
    <Setter Property="FontFamily" Value="Segoe UI" />    
</Style> 

Mais cela ne fonctionne pas. Réglage du type de TextBlock fonctionne pour la plupart des commandes, mais il y a quelques contrôles où cela ne s'applique pas.

Je sais que vous pouvez définir la police sur une fenêtre et ont tous les contrôles enfants de cette fenêtre héritent de la police. Mais je pense que toutes les fenêtres de dialogue reviendront à la police par défaut, ce qui n'est pas exactement ce que je veux.

Des idées?

Répondre

49

En supposant que votre Window sous-classes ne sont pas prioritaires DefaultStyleKey, vous pouvez simplement l'ajouter à votre style de fenêtre, depuis TextElement.FontFamilyProperty est une propriété héritée:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontFamily" Value="Segoe UI" />    
</Style> 

Vous devez également ajouter ce qui suit à votre constructeur App après l'appel InitializeComponent:

FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata 
{ 
    DefaultValue = FindResource(typeof(Window)) 
}); 

Comment ça marche: Une fois l'objet App termine l'initialisation, le style de fenêtre qui y est indiquée est fait le style par défaut pour toutes les fenêtres.

+0

Cela ne fonctionne pas parce que le style n'est pas appliquée types qui sont hérités forment une fenêtre. – Matze

+0

@Matze: Cela fonctionne pour moi. Peut-être que vous avez accidentellement outrepassé DefaultStyleKey ou explicitement défini un style de fenêtre? –

+1

@Ray: Votre extrait ne fonctionne pas vraiment. Parce que vous devez utiliser une classe dérivée de Window, du code supplémentaire et/ou xal est impliqué. – Matze

7

Je trouve ceci:

TextElement.FontFamilyProperty.OverrideMetadata(
typeof(TextElement), 
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS"))); 

TextBlock.FontFamilyProperty.OverrideMetadata(
typeof(TextBlock), 
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS"))); 
+26

lol @ sans –

-1

Essayez cette solution de contournement simple dans le App.xaml (pas de code derrière nécessaire):

<SolidColorBrush x:Key="ForeBrush" Color="Blue" /> 

<Style x:Key="GenericTextStyle"> 
    <!-- Generic control forecolor definition --> 
    <Setter Property="Control.Foreground" Value="{StaticResource ForeBrush}" /> 

    <!-- Add a definition for each unworking nested control --> 
    <Style.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Foreground" Value="{StaticResource ForeBrush}" /> 
     </Style> 
    </Style.Resources> 
</Style> 

Il suffit de relier vos fenêtres de style à ce sujet. Fonctionne parfaitement pour moi. Seules certaines propriétés doivent être définies dans l'arborescence imbriquée. Par exemple, la propriété FontSize peut être spécifiée uniquement dans la section générique.

Je ne sais pas pourquoi il est nécessaire de faire ce tour. C'est étrange parce que Label devrait être dérivé de Control. Quelqu'un a une idée à ce sujet?

6

Une façon simple de le faire par programme:

public MainWindow() 
{ 
    this.FontFamily = new FontFamily("Segoe UI"); 
} 
+2

comic je m'y attendais pas à définir dans le code. – Jowen

16

La plupart des solutions proposées ne fonctionne pas pour moi. Ma solution simple:

Ajouter à ce App.xaml:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontSize" 
      Value="14" /> 
</Style> 

Ajouter dans votre constructeur MainWindow (après InitializeComponent):

Style = (Style)FindResource(typeof(Window));