(WPF) Come impostare il valore di un sys:Doppia SystemFonts.MessageFontSize da ResourceDictionary?
-
23-09-2019 - |
Domanda
Scenario:
Voglio usare 3 standard dimensione del carattere per la mia applicazione WPF : BigFontSize
, NormalFontSize
, e SmallFontSize
.Questi sono valori doppi e sono definiti in dizionario risorse (dove sys
è giustamente definito):
<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>
Questo funziona bene.Ma io sono selezionati in modo casuale 14 come una dimensione normale.Quello che voglio è quello di ottenere un sistema definito la dimensione del font per NormalFontSize
.(Se questo è fatto, posso utilizzare un convertitore come descritto qui per ottenere BigFontSize
e SmallFontSize
relativa a NormalFontSize
)
Indizio :
Ho trovato la documentazione che la dimensione predefinita del carattere viene memorizzato in una proprietà statica (doppio) SystemFonts.MessageFontSize
.Ma cosa devo fare per recuperare il valore di risorsa dizionario?(So Binding
o DynamicResource
non può essere applicato.Ma hey, questo è un valore statico, così come non si può applicare StaticResource
o x:Static
o quello che è?)
Ho provato
<sys:Double x:Key="XXXFontSize">
<StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
e
<sys:Double x:Key="XXXFontSize">
<x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
Entrambi non sembra funzionare (come previsto).Ottengo un errore che dice Cannot add content to object of type 'System.Double'.
Nota:
- Non voglio farlo da codice, e.g da App().(E ' possibile avere un code-behind per ResourceDictionary?)
Non voglio incapsulare questo generalizzata stile da cui altri stili possono essere derivati (utilizzando
BasedOn
) perché ho diversi Dizionari Risorse, e non sarà possibile utilizzareDynamicResource
conBasedOn
Che è, non utilizzo<Style x:Key="BigFont" TargetType="{x:Type Control}"}> <Setter Property="Control.FontSize" Value="{Binding Source={x:Static SystemFonts.MessageFontSize}, Converter={ . . . }" /> </Style>
Perché, se ho uno stile in altri ResourceDictionary, dire
HeaderTextBlockStyle
, quindi avrei dovuto usareBasedOn={DynamicResource BigFont}
che non è possibile (credo)
Qualsiasi aiuto sarebbe molto apprezzato.
Grazie.
TAG :WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource
Soluzione
Ho fatto come questo...
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);
}
}
...e funziona come un miracolo!!!Posso utilizzare queste risorse (parziale) delle risorse dizionario o da altri dizionari risorse come questo...
<Style ...>
<Setter Property="FontSize"
Value="{DynamicResource MediumFontSize}" />
...
</Style>
Non so se è una "buona pratica" o meno (per favore un commento su questo), so solo che funziona..!!!
Altri suggerimenti
Check out questo articolo: Ignorare stili predefiniti Si può avere quello che stai cercando.