2009-05-21 7 views
51

Je crée une application WPF et j'aimerais connaître la meilleure façon de changer la taille de la police pour chaque élément de l'interface utilisateur. Puis-je créer un dictionnaire de ressources et définir des styles pour définir la taille de la police pour tous les contrôles que j'utilise?Taille de police globale WPF

Quelle est la meilleure pratique?

Répondre

69

Je ferais ce chemin:

<Window.Resources> 
     <Style TargetType="{x:Type Control}" x:Key="baseStyle"> 
      <Setter Property="FontSize" Value="100" /> 
     </Style> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type Label}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type ListView}" BasedOn="{StaticResource baseStyle}"></Style> 
     <!-- ComboBox, RadioButton, CheckBox, etc... --> 
    </Window.Resources> 

De cette façon, si je veux changer TOUS les contrôles, je devrais juste changer le style "baseStyle", le reste en héritera. (C'est ce que les propriétés de BasedOn, vous pouvez également étendre le style de base si vous créez d'autres setters dans le style hérité)

+3

Et si vous avez besoin de changer la taille de la police à la volée, assurez-vous que tous sont déclarés DynamicResource, aussi bien dans les styles et les références de style à « baseStyle ». –

+0

Seroiouslly? J'ai essayé de le faire et j'ai cette erreur: La propriété 'BaseOn' ne supporte pas les valeurs de type 'DynamicResourceExtension'. Je viens de changer le code de StaticResource à DynamicResource. Que pensez-vous qu'il manque? – Carlo

+0

J'ai oublié ce petit problème. Nous avons toutes nos déclarations configurées comme Setters déclarées par contrôle afin que nous n'ayons pas d'énormes hiérarchies. Ce post l'explique plutôt bien. http://stackoverflow.com/questions/585429/using-basedon-style-property-on-dynamicresources –

3

Pour tous les styles de WPF, vous devez disposer d'un dictionnaire de ressources distinct contenant les styles de votre application.

Si vous souhaitez avoir une seule taille de police réutilisée dans l'application, créez simplement un style pour cette taille de police. Vous pouvez lui donner un nom/une clé unique à utiliser explicitement ou vous pouvez définir un targetType qui transcende tout au long de l'application.

explicite clé:

<Style 
    x:Key="MyFontSize" 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<Control 
    Style="{StaticResource MyFontSize}" /> 

* Notez que ce style peut être utilisé avec des commandes qui ont contentPresenters

Pour tous TextBlocks dans l'application:

<Style 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<TextBlock 
     Text="This text will be size 10" /> 
35

FontSizeProperty est hérité du contrôle parent. Vous avez juste besoin de changer FontSize de votre fenêtre principale.

Si vous n'avez pas besoin comportement dynamique cela devrait fonctionner:

Ajouter un style pour la fenêtre à votre ResourceDictionary

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

Appliquer le style à votre forme principale (ne sera pas appliquée implicitement parce que son un type dérivé) à appliquer une fois

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

ressemble à une meilleure pratique que la réponse qui a été marquée comme la solution. Je vais aller avec ça, en tout cas c'est beaucoup moins de code. –

+2

EDIT: Ne fonctionne pas (avec framework 4.5 dans tous les cas). –

+0

@KoertvanKleef - cela fonctionne pour moi sur .NET 4.5, quel problème voyez-vous? – joshcomley

1

Si vous devez changer FontSize programme, non statique (XAML) global, pour toutes vos fenêtres, vous pouvez le faire:

TextElement.FontSizeProperty.OverrideMetadata(
      typeof(TextElement), 
      new FrameworkPropertyMetadata(16.0)); 

     TextBlock.FontSizeProperty.OverrideMetadata(
      typeof(TextBlock), 
      new FrameworkPropertyMetadata(16.0)); 

Ces valeurs sont appliquées à toute TextBlock, étiquettes et presque tous les textes dans toutes les fenêtres, alors qu'il n'a pas un FontSize explicite défini. Mais cela n'affecte pas TextBox, vous devez écrire un code similaire pour celui-ci ou tout autre contrôle spécial.

24

Une autre option consiste à définir les ressources FontFamily et FontSize en tant que ressources.

<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily> 
<sys:Double x:Key="BaseFontSize">12</sys:Double> 

De cette façon, vous pouvez les utiliser dans vos setters.

+0

Cela fonctionne mieux pour moi car il vous permet d'utiliser {DynamicResource} et de modifier la taille des polices lors de l'exécution. – Peter

+4

Doit importer _xmlns: sys = "espace de noms clr: System; assembly = mscorlib" _ et cette méthode a fonctionné parfaitement. – wchoward

8
Application.Current.MainWindow.FontSize = _appBodyFontSize; 

De cette façon, vous pouvez changer la taille de la police au moment de l'exécution également.

3

TextElement.FontSize est une propriété Hériter, ce qui signifie que vous pouvez simplement définir la taille de la police à l'élément racine, et tous les enfants éléments utiliseront cette taille (tant que vous ne les modifiez pas manuellement)

+0

Important: "tant que vous ne les changez pas manuellement". Il m'a fallu du temps pour comprendre que l'héritage de polices fonctionnait parce que je l'ai défini quelque part pour un parent manuellement. –

12

<Window> a une propriété FontSize.

Vous pouvez donc définir la taille de police désirée dans l'élément si vous voulez changer la taille de police dans tous les éléments de cette fenêtre.

<Window FontSize="12"> 

</Window> 
Questions connexes