Pregunta

Escenario:

Quiero utilizar 3 tamaño de fuente estándar para mi aplicación WPF: BigFontSize, NormalFontSize y SmallFontSize. Estos son valores dobles y se definen en el diccionario de recurso como (donde sys se define apropiadamente):

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

Esto funciona bien. Pero he seleccionado aleatoriamente 14 como un tamaño normal. Lo que quiero es conseguir un tamaño de letra del sistema definido para NormalFontSize. (Si se hace eso, puedo usar un convertidor como se describe en aquí para obtener BigFontSize y SmallFontSize relativa a NormalFontSize)


Pista:

he encontrado en la documentación que el tamaño de fuente predeterminado se almacena en un SystemFonts.MessageFontSize propiedad estática (doble). Pero, ¿qué debo hacer para recuperar ese valor al diccionario de recursos? (Sé Binding o DynamicResource no puede aplicarse. Pero bueno, esto es un valor estático, así que ¿cómo puedo aplicar StaticResource o x:Static o lo que sea?)

He tratado

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

y

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

Ambos de los cuales no parecen funcionar (como se esperaba). Me aparece un error diciendo Cannot add content to object of type 'System.Double'.

Nota:

  • No quiero hacer esto desde el código, por ejemplo desde App (). (¿Es posible tener un código subyacente para ResourceDictionary?)
  • No quiero para encapsular esto en estilo generalizada de la que otros estilos se pueden derivar (usando BasedOn) porque tengo varios diccionarios de recursos, y no voy a ser posible usar DynamicResource con BasedOn
    Es decir, no puedo usar

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

    Debido a que, si tengo un estilo en sí ResourceDictionary, HeaderTextBlockStyle decir, entonces yo tendría que usar BasedOn={DynamicResource BigFont} que no es posible (creo)

Cualquier ayuda sería muy apreciada.
Gracias.

etiquetas : WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

¿Fue útil?

Solución

he hecho como este ...

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);
    }
}

... y está funcionando como un milagro !!! Puedo utilizar estos recursos en el mismo diccionario de recursos (parcial) o de otros diccionarios de recursos de este tipo de ...

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

    ...

</Style>

No sé si es una "buena práctica" o no (por favor comente sobre esto), sólo sé que funciona .. !!!

Otros consejos

Consulte este artículo: estilos por defecto Ignorar puede tener lo que busca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top