web-dev-qa-db-fra.com

Comment définir la police par défaut pour une application WPF?

Je veux pouvoir définir une famille de polices pour mon application WPF. Utiliser de préférence un dictionnaire de ressources comme thème référencé à partir de App.xaml. J'ai essayé de créer un Style comme suit:

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

Mais ça ne marche pas. La définition du type sur TextBlock fonctionne pour la plupart des contrôles 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 que 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?

70
Jakup

En supposant que vos sous-classes Window ne remplacent pas DefaultStyleKey, vous pouvez simplement les ajouter à votre style de fenêtre, car 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 les éléments suivants à votre constructeur d'application après l'appel InitializeComponent:

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

Fonctionnement: une fois l'initialisation de l'objet App terminée, le style de fenêtre spécifié dans celui-ci devient le style par défaut pour toutes les fenêtres.

55
Ray Burns

La plupart des solutions proposées n'ont pas fonctionné pour moi. Ma solution simple:

Ajoutez ceci à App.xaml:

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

Ajoutez ceci dans votre constructeur MainWindow (après InitializeComponent):

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

Une façon simple de le faire par programme:

public MainWindow()
{
    this.FontFamily = new FontFamily("Segoe UI");
}
10
Strong

J'ai trouvé ça :

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

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

En fait, vous pouvez obtenir une solution XAML complète combinant certaines des autres réponses ici.

Si votre fenêtre principale s'appelle WinMain (celle que vous chargez avant toutes les autres), ajoutez simplement une référence à un style nommé par ex. WinAll

<Window x:Class="MyNamespace.WinMain"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="WinMain" Height="450" Width="800"
    Style="{StaticResource WinAll}">

puis définissez votre style de cette façon

<Style x:Key="WinAll" TargetType="{x:Type Window}">
    <Setter Property="FontFamily"
        Value="Comic Sans MS" />
    <Setter Property="FontSize"
        Value="14" />
</Style>
2
Francesco B.