(WPF) Comment définir la valeur d'un sys: Double à SystemFonts.MessageFontSize de ResourceDictionary?
-
23-09-2019 - |
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'utiliserDynamicResource
avecBasedOn
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 utiliserBasedOn={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
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.