web-dev-qa-db-fra.com

Taille de police globale WPF

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

Quelle est la meilleure pratique?

65
Jose

Je le ferais de cette façon:

<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 n'aurais qu'à changer le style "baseStyle", le reste en hériterait. (C'est ce que basé BasedOn, vous pouvez également étendre le style de base si vous créez d'autres setters à l'intérieur du style hérité)

85
Carlo

FontSizeProperty est hérité du contrôle parent. Il vous suffit donc de modifier la taille de police de votre fenêtre principale.

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

Ajoutez un style pour Window à votre ResourceDictionary

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

Appliquer le style à votre formulaire principal (ne sera pas appliqué implicitement car il s'agit d'un type dérivé)

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

Une autre option consiste à définir la famille de polices et la taille de police comme 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.

25
Neal

<Window> a une propriété FontSize.

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

<Window FontSize="12">

</Window>
21
Application.Current.MainWindow.FontSize = _appBodyFontSize;

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

8
Vipul

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

4
Lin

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

Si vous souhaitez avoir une seule taille de police qui est réutilisée dans l'application, créez simplement un style pour cette taille de police. Vous pouvez soit lui donner un nom/clé unique à utiliser explicitement, soit définir un type de cible qui transcendera dans toute l'application.

Clé explicite:

<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 contrôles qui ont du contenu

Pour tous les blocs de texte de l'application:

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

<TextBlock
        Text="This text will be size 10" />
3
Chris Nicol

Si vous devez modifier par programme FontSize global, et non statiquement (XAML), pour qu'il soit appliqué une fois pour toutes vos fenêtres, vous pouvez faire:

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

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

Ces valeurs sont appliquées à n'importe quel TextBlock, étiquettes et presque n'importe quel texte dans n'importe quelle fenêtre, alors qu'il n'a pas de FontSize explicite défini. Mais cela n'affecte pas pour TextBox, vous devez écrire un code similaire pour lui ou tout autre contrôle spécial.

1
Pablonete

Pour modifier dynamiquement la taille de la police globalement avec ctrl-molette:

XAML:

<Window Name="MainWindow" ... PreviewMouseWheel="MainWindow_PreviewMouseWheel">

code derrière:

private void MainWindow_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    if ((Keyboard.Modifiers & ModifierKeys.Control) != 0)
    {
        if (e.Delta > 0)
            ++mainCtrl.FontSize;
        if (e.Delta < 0 && mainCtrl.FontSize > 1)
             --mainCtrl.FontSize;
    }
}
1
Jim Balter