2009-05-21 17 views
51

Estoy creando una aplicación WPF y me gustaría saber la mejor manera de poder cambiar el tamaño de la fuente para cada elemento en la interfaz de usuario. ¿Creé un diccionario de recursos y configuré Estilos para establecer el tamaño de fuente para todos los controles que uso?WPF tamaño de fuente global

¿Cuál es la mejor práctica?

Respuesta

69

lo haría de esta manera:

<Window.Resources> 
     <Style TargetType="{x:Type Control}" x:Key="baseStyle"> 
      <Setter Property="FontSize" Value="100" /> 
     </Style> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type Label}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type ListView}" BasedOn="{StaticResource baseStyle}"></Style> 
     <!-- ComboBox, RadioButton, CheckBox, etc... --> 
    </Window.Resources> 

De esta manera, si quiero cambiar TODOS los controles, solo tendría que cambiar el estilo "baseStyle", el resto simplemente heredaría de él. (Esa es la propiedad BasedOn, también puede ampliar el estilo base si crea otros setters dentro del estilo heredado)

+3

Y si necesita cambiar el tamaño de la fuente sobre la marcha, asegurarse de que todos ellos son declarados a DynamicResource, tanto en los estilos y en las referencias de estilo para "baseStyle". –

+0

Seroiouslly? Intenté hacer eso y me sale este error: la propiedad 'BaseOn' no admite valores del tipo 'DynamicResourceExtension'. Acabo de cambiar el código de StaticResource a DynamicResource. ¿Qué crees que falta? – Carlo

+0

Olvidé ese pequeño problema. Tenemos todas nuestras declaraciones configuradas como Setters declarados por control para que no tengamos grandes jerarquías. Esta publicación lo explica bastante bien. http://stackoverflow.com/questions/585429/using-basedon-style-property-on-dynamicresources –

3

Para cualquier estilo en WPF, debe tener un diccionario de recursos independiente que contenga los estilos para su aplicación.

Si desea tener un único Tamaño de fuente que se reutilice en toda la aplicación, simplemente cree un estilo para ese tamaño de fuente. Puede darle un nombre/clave único para usar explícitamente o puede establecer un targetType que trascienda a través de la aplicación.

explícita Clave:

<Style 
    x:Key="MyFontSize" 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<Control 
    Style="{StaticResource MyFontSize}" /> 

* Nota este estilo se puede utilizar con controles que tienen contentPresenters

Para todos los bloques de texto en la aplicación:

<Style 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<TextBlock 
     Text="This text will be size 10" /> 
35

FontSizeProperty se hereda de Parent Control. Entonces solo necesitas cambiar FontSize de tu ventana principal.

Si no es necesario un comportamiento dinámico que esto debería funcionar:

Añadir un estilo de ventana a su ResourceDictionary

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontSize" Value="15" /> 
</Style> 

Aplique el estilo a su forma principal (no se aplica debido a que su implícita un tipo derivado)

Style = (Style)FindResource(typeof (Window)); 
+0

This suena como una mejor práctica que la respuesta que se marcó como la solución. Iré con esto, en cualquier caso, es mucho menos código. –

+2

EDITAR: no funciona (con framework 4.5 en cualquier caso). –

+0

@KoertvanKleef - me funciona en .NET 4.5, ¿qué problema estás viendo? – joshcomley

1

Si necesita cambiar mediante programación Tamaño de Letra global, no estáticamente (XAML), que se aplica una vez por todas sus ventanas, se puede hacer:

TextElement.FontSizeProperty.OverrideMetadata(
      typeof(TextElement), 
      new FrameworkPropertyMetadata(16.0)); 

     TextBlock.FontSizeProperty.OverrideMetadata(
      typeof(TextBlock), 
      new FrameworkPropertyMetadata(16.0)); 

Estos valores se aplican a cualquier TextBlock, etiquetas y casi cualquier texto en cualquier ventana, mientras que no tiene un Tamaño de Letra explícita definida. Pero esto no afecta a TextBox, tiene que escribir un código similar para él o cualquier otro control especial.

24

Otra opción es definir FontFamily y FontSize como recursos.

<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily> 
<sys:Double x:Key="BaseFontSize">12</sys:Double> 

De esa manera se les puede utilizar en sus definidores.

+0

Esto funciona mejor para mí, ya que le permite usar {DynamicResource} y cambiar los tamaños de fuente en tiempo de ejecución. – Peter

+4

Tuve que importar _xmlns: sys = "clr-namespace: System; assembly = mscorlib" _ y este método funcionó perfecto. – wchoward

8
Application.Current.MainWindow.FontSize = _appBodyFontSize; 

esta manera se puede cambiar el tamaño de fuente en tiempo de ejecución también.

3

TextElement.FontSize es una propiedad hereda, lo que significa que basta con establecer el tamaño de la fuente al elemento raíz, y todos los elementos que los niños usarán tamaño (siempre y cuando no se cambie manualmente)

+0

Importante: "siempre y cuando no los cambie manualmente". Me llevó algo de tiempo descubrir que la herencia de la fuente funcionó porque la configuré para un padre de forma manual. –

12

<Window> tiene una propiedad FontSize.

Para que pueda establecer el tamaño de fuente deseado en el elemento si desea cambiar el tamaño de fuente en todos los elementos dentro de esa ventana.

<Window FontSize="12"> 

</Window> 
Cuestiones relacionadas