2010-06-29 21 views
58

Desidero essere in grado di definire una famiglia di caratteri per la mia applicazione WPF. Utilizzare preferibilmente un dizionario risorse come tema a cui fare riferimento da App.xaml. Ho provato la creazione di un Style come segue:Come impostare il carattere predefinito per un'applicazione WPF?

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

Ma questo non funziona. L'impostazione del tipo su TextBlock funziona per la maggior parte dei controlli, ma alcuni controlli non sono applicabili.

So che è possibile impostare il carattere su una finestra e che tutti i controlli figlio di quella finestra ereditano il carattere. Ma penso che qualsiasi finestra di dialogo tornerà al carattere predefinito, che non è esattamente quello che voglio.

Qualche idea?

risposta

49

Assumendo che il Window sottoclassi non prevalgono DefaultStyleKey, si può semplicemente aggiungere al vostro stile di finestra, in quanto TextElement.FontFamilyProperty è una proprietà ereditata:

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

È inoltre necessario aggiungere quanto segue al costruttore di app dopo il InitializeComponent chiamata:

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

Come funziona: Dopo che l'oggetto App termina l'inizializzazione, lo stile della finestra ivi indicata è fatto lo stile predefinito per tutte le finestre.

+0

Questo non funziona perché lo stile non viene applicato a tipi che sono ereditati dalla finestra. – Matze

+0

@Matze: Funziona per me. Forse hai sovrascritto per errore DefaultStyleKey o hai impostato esplicitamente uno stile di finestra? –

+1

@Ray: lo snippet sicuramente non funziona. Poiché devi utilizzare una classe derivata da Window, sono coinvolti alcuni codici e/o xal aggiuntivi. – Matze

7

ho trovato questo:

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

Prova questa semplice soluzione nel App.xaml (nessun codice dietro necessario):

<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> 

Basta vincolare il proprio stile di Windows a questo. Funziona perfettamente per me. Solo alcune proprietà devono essere definite nell'albero nidificato. Ad esempio la proprietà FontSize può essere specificata solo nella sezione generica.

Non so perché è necessario fare questo trucco. È strano perché l'etichetta dovrebbe essere derivata da Control. Qualcuno ha qualche idea al riguardo?

6

Un modo semplice per farlo a livello di codice:

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

Non mi aspetto che sia impostato nel codice. – Jowen

16

La maggior parte delle soluzioni proposte non ha funzionato per me. La mia soluzione semplice:

Aggiungi questo per App.xaml:

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

Aggiungi questo nel costruttore MainWindow (dopo InitializeComponent):

Style = (Style)FindResource(typeof(Window)); 
Problemi correlati