2010-06-29 27 views
58

Quiero ser capaz de definir una familia de fuentes para mi aplicación WPF. Preferiblemente utilizando un diccionario de recursos como un tema al que se hace referencia desde App.xaml. He intentado crear un Style de la siguiente manera:¿Cómo configurar la fuente predeterminada para una aplicación WPF?

<Style TargetType="{x:Type Control}"> 
    <Setter Property="FontFamily" Value="Segoe UI" />    
</Style> 

Pero esto no funciona. Configurar el tipo a TextBlock funciona para la mayoría de los controles, pero hay algunos controles donde esto no se aplica.

Sé que puede establecer la fuente en una ventana y hacer que todos los controles secundarios de esa ventana hereden la fuente. Pero creo que cualquier ventana de diálogo volverá a la fuente predeterminada, que no es exactamente lo que quiero.

¿Alguna idea?

Respuesta

49

Suponiendo sus subclases Window no anulan DefaultStyleKey, sólo tiene que añadir a su estilo de ventana, ya que TextElement.FontFamilyProperty es una propiedad heredada:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontFamily" Value="Segoe UI" />    
</Style> 

También es necesario añadir lo siguiente a su constructor de aplicación después de InitializeComponent la llamada:

FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata 
{ 
    DefaultValue = FindResource(typeof(Window)) 
}); 

Cómo funciona: Después de que el objeto App termina la inicialización, el estilo de ventana especificado en el mismo se hace el estilo por defecto para todas las ventanas.

+0

Esto no funciona porque el estilo no se aplica a tipos que se heredan de Window. – Matze

+0

@Matze: Funciona para mí. ¿Tal vez sobreescribió DefaultStyleKey accidentalmente o estableció explícitamente un estilo de ventana? –

+1

@Ray: definitivamente tu fragmento no funciona. Debido a que tiene que usar una clase derivada de Window, se trata de un código adicional y/o xal. – Matze

7

encontré esto:

TextElement.FontFamilyProperty.OverrideMetadata(
typeof(TextElement), 
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS"))); 

TextBlock.FontFamilyProperty.OverrideMetadata(
typeof(TextBlock), 
new FrameworkPropertyMetadata(
    new FontFamily("Comic Sans MS"))); 
+26

lol @ comic sans –

-1

Pruebe esta sencilla solución en la App.xaml (sin código detrás necesario):

<SolidColorBrush x:Key="ForeBrush" Color="Blue" /> 

<Style x:Key="GenericTextStyle"> 
    <!-- Generic control forecolor definition --> 
    <Setter Property="Control.Foreground" Value="{StaticResource ForeBrush}" /> 

    <!-- Add a definition for each unworking nested control --> 
    <Style.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Foreground" Value="{StaticResource ForeBrush}" /> 
     </Style> 
    </Style.Resources> 
</Style> 

Sólo vincular a su estilo de ventanas para esto. Funciona perfectamente para mi Solo algunas propiedades necesitan ser definidas en el árbol anidado. Por ejemplo, la propiedad FontSize se puede especificar solo en la sección genérica.

No sé por qué es necesario hacer este truco. Es extraño porque Label debería derivarse de Control. Alguien tiene alguna idea al respecto?

6

Una forma sencilla de hacerlo mediante programación:

public MainWindow() 
{ 
    this.FontFamily = new FontFamily("Segoe UI"); 
} 
+2

No esperaría que se establezca en el código. – Jowen

16

La mayoría de las soluciones propuestas no funcionó para mí. Mi solución simple:

Añadir esto a App.xaml:

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

Añadir esta en su constructor MainWindow (después de InitializeComponent):

Style = (Style)FindResource(typeof(Window)); 
Cuestiones relacionadas