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 utilizzare DynamicResource con BasedOn
    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 usare BasedOn={DynamicResource BigFont} che non è possibile (credo)

Qualsiasi aiuto sarebbe molto apprezzato.
Grazie.

TAG :WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top