2010-06-29 23 views
58

Ich möchte in der Lage sein, eine Schriftfamilie für meine WPF-Anwendung zu definieren. Vorzugsweise wird ein Ressourcenwörterbuch als Thema verwendet, auf das von App.xaml verwiesen wird. Ich habe versucht, die Schaffung einer Style wie folgt:Wie wird die Standardschrift für eine WPF-Anwendung festgelegt?

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

Aber das funktioniert nicht. Das Festlegen des Typs auf TextBlock funktioniert für die meisten Steuerelemente, aber es gibt ein paar Steuerelemente, wo dies nicht gilt.

Ich weiß, dass Sie die Schriftart in einem Fenster festlegen können und alle untergeordneten Steuerelemente dieses Fensters die Schriftart erben. Aber ich denke, jedes Dialogfenster wird auf die Standardschrift zurückgehen, was nicht genau das ist, was ich möchte.

Irgendwelche Ideen?

Antwort

49

Angenommen, Ihre Window Subklassen nicht DefaultStyleKey außer Kraft setzen, können Sie einfach zu Ihrem Fensterstil hinzuzufügen, da TextElement.FontFamilyProperty eine erbliche Eigenschaft ist:

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

Sie auch die folgenden in Ihrem App-Konstruktor hinzufügen müssen nach der InitializeComponent Aufruf:

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

Wie es funktioniert: nach dem App-Objekt Initialisierung beendet ist, spezifizierte der Fensterstil darin den Standardstil für alle Fenster gemacht.

+0

Das funktioniert nicht, weil der Stil nicht angewendet wird Typen, die von Window geerbt werden. – Matze

+0

@Matze: Es funktioniert für mich. Vielleicht haben Sie versehentlich DefaultStyleKey überschrieben oder explizit einen Fensterstil festgelegt? –

+1

@Ray: Dein Snippet funktioniert definitiv nicht. Da Sie eine Klasse verwenden müssen, die von Windows abgeleitet ist, ist zusätzlicher Code und/oder xal beteiligt. – Matze

7

Ich fand dies:

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

diese einfache Abhilfe Versuchen Sie in App.xaml (kein Code hinter erforderlich):

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

Sie Ihre Windows-Stil dazu binden. Funktioniert perfekt für mich. Nur einige Eigenschaften müssen in der verschachtelten Struktur definiert werden. Zum Beispiel kann die Eigenschaft FontSize nur im generischen Abschnitt angegeben werden.

Ich weiß nicht, warum ist notwendig, diesen Trick zu tun. Es ist seltsam, weil Label von Control abgeleitet werden sollte. Hat jemand eine Idee?

6

Eine einfache Möglichkeit, es programmatisch zu tun:

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

Ich würde nicht erwarten, dass es in Code festgelegt wird. – Jowen

16

Die meisten vorgeschlagenen Lösungen nicht für mich arbeiten. Meine einfache Lösung:

Fügen Sie diese auf App.xaml:

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

Fügen Sie diese in Ihrem Mainwindow-Konstruktor (nach InitializeComponent):

Style = (Style)FindResource(typeof(Window)); 
Verwandte Themen