(WPF) Comment définir la valeur d'un sys: Double à SystemFonts.MessageFontSize de ResourceDictionary?

StackOverflow https://stackoverflow.com/questions/2161960

Question

Scénario:

Je veux utiliser 3 taille de police standard pour mon application WPF: BigFontSize, NormalFontSize et SmallFontSize. Ce sont des valeurs doubles et elles sont définies dans le dictionnaire de ressources comme (où sys est défini de manière appropriée):

<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>

Cela fonctionne bien. Mais je l'ai choisi au hasard 14 comme une taille normale. Ce que je veux est d'obtenir une taille de police définie système pour NormalFontSize. (Si cela est fait, je peux utiliser un convertisseur comme décrit ici pour obtenir BigFontSize et SmallFontSize par rapport à NormalFontSize)


Clue:

Je trouve de la documentation que la taille de la police par défaut est stocké dans une propriété statique (double) SystemFonts.MessageFontSize. Mais que dois-je faire pour récupérer cette valeur à la ressource dictionnaire? (Je sais Binding ou DynamicResource ne peut pas être appliqué. Mais bon, cela est une valeur statique, alors comment puis-je appliquer StaticResource ou x:Static ou quoi?)

J'ai essayé

<sys:Double x:Key="XXXFontSize">
    <StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>

et

<sys:Double x:Key="XXXFontSize">
    <x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>

Les deux qui ne semble pas fonctionner (comme prévu). Je reçois une erreur disant Cannot add content to object of type 'System.Double'.

Remarque:

  • Je ne veux pas le faire à partir du code, par exemple App (). (Est-il possible d'avoir un code-behind pour ResourceDictionary?)
  • Je ne veux pas résumer ce style généralisé à partir de laquelle d'autres styles peuvent être dérivés (à l'aide BasedOn) parce que j'ai plusieurs dictionnaires de ressources, et il ne serai pas possible d'utiliser DynamicResource avec BasedOn
    C'est, je ne peux pas utiliser

    <Style x:Key="BigFont" TargetType="{x:Type Control}"}>
        <Setter Property="Control.FontSize" 
                Value="{Binding Source={x:Static SystemFonts.MessageFontSize},
                                Converter={ . . . }" />
    </Style>
    

    Parce que, si j'ai un style dans d'autres ResourceDictionary, dire HeaderTextBlockStyle, alors je dois utiliser BasedOn={DynamicResource BigFont} qui n'est pas possible (je pense)

Toute aide serait grandement appréciée.
Merci.

TAGS : WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

Était-ce utile?

La solution

Je l'ai fait comme ça ...

public partial class GlobalResources : ResourceDictionary
{
    public GlobalResources()
    {
        this.Add("GiantFontSize", SystemFonts.MessageFontSize * 2.5);
        this.Add("BigFontSize", SystemFonts.MessageFontSize * 1.5);
        this.Add("MediumFontSize", SystemFonts.MessageFontSize * 1.25);
        this.Add("NormalFontSize", SystemFonts.MessageFontSize);
        this.Add("SmallFontSize", SystemFonts.MessageFontSize * 0.85);
    }
}

... et cela fonctionne comme un miracle !!! Je peux utiliser ces ressources dans le même dictionnaire (partiel) des ressources ou d'autres dictionnaires de ressources comme celui-ci ...

<Style ...>
    <Setter Property="FontSize"
            Value="{DynamicResource MediumFontSize}" />

    ...

</Style>

Je ne sais pas si elle est une « bonne pratique » ou non (s'il vous plaît commentaire à ce sujet), je ne sais que cela fonctionne .. !!!

Autres conseils

Consultez cet article: Remplacer les styles par défaut Il peut avoir ce que vous recherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top