2010-06-29 873 views
58

我希望能夠爲我的WPF應用程序定義一個字體系列。優選地使用資源字典作爲從App.xaml引用的主題。我試過創建一個Style如下:如何設置WPF應用程序的默認字體?

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

但這不起作用。將類型設置爲TextBlock適用於大多數控件,但有些控件在此不適用。

我知道你可以在窗口上設置字體,並讓該窗口的所有子控件繼承字體。但我認爲任何對話窗口都會返回到默認字體,這不正是我想要的。

任何想法?

回答

49

假設你Window子類不重寫DefaultStyleKey,你可以簡單地把它添加到你的窗口風格,因爲TextElement.FontFamilyProperty是一種遺傳特性:

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

您還需要以下後,添加到您的應用程序的構造在InitializeComponent電話:

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

工作原理:應用程序對象完成初始化後,其中規定的窗口樣式成爲默認的風格爲所有窗口。

+0

因爲款式不應用到這不起作用從Window繼承的類型。 – Matze 2010-08-13 08:30:57

+0

@Matze:它適合我。也許你不小心覆蓋了DefaultStyleKey或顯式設置窗口樣式? – 2010-08-13 19:04:29

+1

@射線:你的片段絕對不行。因爲您必須使用從Window派生的類,所以還需要一些其他代碼和/或xal。 – Matze 2010-08-16 14:53:29

7

我發現這一點:

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 – 2012-07-10 18:16:22

-1

嘗試在App.xaml這個簡單的解決方法(沒有後面所需的代碼):

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

你的windows風格就綁定到這一點。爲我完美工作。只有一些屬性需要在嵌套樹中定義。例如,屬性FontSize只能在通用部分中指定。

我不知道爲什麼有必要這樣做。這很奇怪,因爲標籤應該從Control派生。任何人有任何想法嗎?

6

一個簡單的方法來做到這一點編程:

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

我不希望它被設置在代碼中。 – Jowen 2014-11-19 15:47:36

16

大多數提出的解決方案,我沒有工作。我簡單的解決方案:

此加入的App.xaml:

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

中(之後的InitializeComponent)你的主窗口構造補充一點:

Style = (Style)FindResource(typeof(Window)); 
相關問題