(WPF) Como valor de consigna de un sys: Doble a SystemFonts.MessageFontSize de ResourceDictionary?
-
23-09-2019 - |
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 usarDynamicResource
conBasedOn
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 usarBasedOn={DynamicResource BigFont}
que no es posible (creo)
Cualquier ayuda sería muy apreciada.
Gracias.
etiquetas : WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource
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.