2009-05-21 18 views
51

Sto creando un'app WPF e vorrei conoscere il modo migliore per poter modificare la dimensione del carattere per ogni elemento dell'interfaccia utente. Creo un dizionario risorse e imposta Stili per impostare la dimensione del carattere per tutti i controlli che uso?Dimensione carattere WPF globale

Qual è la migliore pratica?

risposta

69

lo farei questo way:

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

In questo modo, se voglio cambiare TUTTI i controlli, dovrei semplicemente cambiare lo stile "baseStyle", il resto erediterebbe solo da esso. (Questo è il tipo di proprietà di BasedOn, puoi anche estendere lo stile di base se crei altri setter all'interno dello stile ereditato)

+3

E se è necessario modificare la dimensione del carattere al volo, fare in modo che tutti loro sono dichiarati DynamicResource, sia negli stili e nei riferimenti di stile per "baseStyle". –

+0

Seroiouslly? Ho provato a farlo e ottengo questo errore: Proprietà 'BaseOn' non supporta i valori di tipo 'DynamicResourceExtension'. Ho appena cambiato il codice da StaticResource a DynamicResource. Cosa pensi che manchi? – Carlo

+0

Hai dimenticato questo piccolo problema. Abbiamo tutte le nostre dichiarazioni stabilite come setter dichiarati per controllo in modo da non avere enormi gerarchie. Questo post lo spiega abbastanza bene. http://stackoverflow.com/questions/585429/using-basedon-style-property-on-dynamicresources –

3

Per tutti gli stili in WPF, è necessario disporre di un dizionario risorse separato che contenga gli stili per la propria app.

Se si desidera avere una singola dimensione del carattere riutilizzata in tutta l'app, è sufficiente creare uno stile per quella dimensione del carattere. Puoi assegnargli un nome/una chiave univoci da usare esplicitamente oppure puoi impostare un targetType che trascenderà l'intera app.

esplicita chiave:

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

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

* Nota questo stile può essere utilizzato con i controlli che hanno contentPresenters

Per tutti TextBlocks in app:

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

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

FontSizeProperty viene ereditato da Controllo padre. Quindi hai solo bisogno di cambiare FontSize della tua finestra principale.

Se non avete bisogno di comportamento dinamico questo dovrebbe funzionare:

aggiungere uno stile per la finestra al vostro ResourceDictionary

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

Applicare lo stile al modulo principale (che non verrà applicata implicita perché la sua un tipo derivato)

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

suona come una pratica migliore della risposta che è stata contrassegnata come la soluzione. Vado con questo, in ogni caso è molto meno codice. –

+2

EDIT: non funziona (con framework 4.5 in ogni caso). –

+0

@KoertvanKleef - funziona per me su .NET 4.5, quale problema stai vedendo? – joshcomley

1

Se è necessario modificare a livello di FontSize globale, non staticamente (XAML), da applicare una volta per tutte le finestre, si può fare:

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

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

Questi valori vengono applicati a qualsiasi TextBlock, etichette e quasi ogni testo in qualsiasi finestra, mentre non ha un FontSize esplicito definito. Ma questo non ha effetto su TextBox, devi scrivere un codice simile per questo o altri controlli speciali.

24

Un'altra opzione è definire FontFamily e FontSize come risorse.

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

In questo modo è possibile utilizzare per le setter.

+0

Questo funziona meglio per me in quanto consente di utilizzare {DynamicResource} e modificare le dimensioni dei caratteri in fase di esecuzione. – Peter

+4

Ha dovuto importare _xmlns: sys = "clr-namespace: System; assembly = mscorlib" _ e questo metodo ha funzionato perfettamente. – wchoward

8
Application.Current.MainWindow.FontSize = _appBodyFontSize; 

In questo modo è possibile modificare la dimensione del carattere in fase di esecuzione anche.

3

TextElement.FontSize è una proprietà ereditare, il che significa che si può semplicemente impostare la dimensione del carattere in elemento radice, e tutti gli elementi I bambini potranno utilizzare tali dimensioni (fino a quando non si cambia manualmente)

+0

Importante: "a condizione che non vengano modificati manualmente". Mi ci è voluto un po 'di tempo per capire che l'ereditarietà dei font ha funzionato perché l'ho impostata da qualche parte per un genitore manualmente. –

12

<Window> ha una proprietà FontSize.

Quindi è possibile impostare il carattere desiderato in elemento se si desidera modificare il carattere in tutti gli elementi all'interno di quella finestra.

<Window FontSize="12"> 

</Window> 
Problemi correlati