2009-05-21 13 views
51

私はWPFアプリケーションを作成していますが、私はUIの各要素のフォントサイズを変更できる最良の方法を知りたいと思います。リソース辞書を作成し、使用するすべてのコントロールのフォントサイズを設定するスタイルを設定しますか?WPFグローバルフォントサイズ

ベストプラクティスは何ですか?

答えて

69

私はそれをこれを行うと思います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> 

そういう意味で、すべてのコントロールを変更したいのであれば、 "baseStyle"スタイルを変更するだけで、残りはそれから継承されます。 (継承されたスタイルの中に他のセッターを作成する場合は、BasedOnプロパティを継承しているので、ベーススタイルを拡張することもできます)

+3

そして、あなたはその場でフォントサイズを変更する必要がある場合は、それらのすべてがスタイルにし、「baseStyle」へのスタイルの参照の両方で、DynamicResourceに宣言されていることを確認してください。 –

+0

Seroiouslly?私はそれをやってみたが、私はこのエラーが発生します:プロパティ 'BaseOn'は 'DynamicResourceExtension'型の値をサポートしていません。私はStaticResourceからDynamicResourceにコードを変更しました。あなたは何が欠けていると思いますか? – Carlo

+0

その小さな問題を忘れてしまった。私たちは、Settersがコントロールごとに宣言して、巨大な階層を持たないように、すべての宣言を設定しました。この投稿はそれをとてもうまく説明しています。 http://stackoverflow.com/questions/585429/using-basedon-style-property-on-dynamicresources –

3

WPFのどのスタイルでも、アプリケーションのスタイルを含む別のリソース辞書が必要です。

アプリ全体で再利用される単一のフォントサイズを使用する場合は、そのフォントサイズのスタイルを作成するだけです。明示的に使用する一意の名前/キーを指定することも、アプリ全体で超越するtargetTypeを設定することもできます。

キー明示:

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

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

*このスタイルは、アプリ内のすべてのテキストブロックについてはcontentPresenters

を持つコントロールで使用することができます。

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

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

FontSizePropertyは親コントロールから継承されます。したがって、メインウィンドウのFontSizeを変更するだけで済みます。

あなたは、これは動作するはず動的挙動を必要としない場合:

そのため、(暗黙的に適用されることはありません、あなたのメインフォームにスタイルを適用し、あなたのResourceDictionaryに

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

をウィンドウのスタイルを追加します。派生型)

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

This解決策としてマークされた答えよりも優れた練習のように聞こえる。私はこれと一緒に行きます、どんな場合でも、それはずっと少ないコードです。 –

+2

編集:(フレームワーク4.5の場合は)機能しません。 –

+0

@ KoertvanKleef - .NET 4.5で動作しますが、どのような問題が発生していますか? – joshcomley

1

あなたがプログラムですべてのウィンドウに対して一度適用されるグローバルのFontSize、ない静的(XAML)を、変更する必要がある場合は、あなたが行うことができます:

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

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

それは明示的なのFontSizeが定義されていないのに対し、この値は、任意のTextBlockの、ラベルおよび任意のWindowsのほぼすべてのテキストに適用されます。しかし、これはTextBoxには影響しません、あなたはそれや他の特別なコントロールのために同様のコードを書く必要があります。

24

もう一つの選択肢は、FontFamilyとFontSizeをリソースとして定義することです。あなたがセッターにそれらを使用することができる方法

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

+0

これは、{DynamicResource}を使用して実行時にフォントサイズを変更できるので、私にとって最適です。 – Peter

+4

_xmlns:sys = "clr-namespace:System; assembly = mscorlib" _をインポートする必要があり、このメソッドは完璧に機能しました。 – wchoward

8
Application.Current.MainWindow.FontSize = _appBodyFontSize; 

あなたはまた、実行時にフォントサイズを変更することができますこの方法。

3

TextElement.FontSizeは、あなたは、単にルート要素のフォントサイズを設定することができることを意味継承財産であり、かつ、すべての子要素は

+0

重要:「手動で変更しない限り」フォントの継承が親のために手動で設定されているので、それは私には時間がかかりました。 –

12

<Window>が持っている(あなたがそれらを手動で変更しない限り)そのサイズを使用しますプロパティFontSize。

したがって、そのウィンドウ内のすべての要素のフォントサイズを変更する場合は、要素に希望のフォントサイズを設定できます。

<Window FontSize="12"> 

</Window>