WPFアプリを作成していますが、UI内のすべての要素のフォントサイズを変更できる最善の方法を知りたいと思います。リソースディクショナリを作成し、スタイルを設定して、使用するすべてのコントロールのフォントサイズを設定しますか?
ベストプラクティスは何ですか?
私はこのようにします:
<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プロパティのプロパティです。継承されたスタイル内に他のセッターを作成する場合、ベーススタイルを拡張することもできます)
FontSizePropertyは、Parent Controlから継承されます。したがって、メインウィンドウのFontSizeを変更するだけです。
動的な振る舞いが必要なければ、これはうまくいくはずです:
WindowのスタイルをResourceDictionaryに追加します
<Style TargetType="{x:Type Window}">
<Setter Property="FontSize" Value="15" />
</Style>
スタイルをメインフォームに適用します(派生型であるため、暗黙的に適用されません)
Style = (Style)FindResource(typeof (Window));
別のオプションは、FontFamilyとFontSizeをリソースとして定義することです。
<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily>
<sys:Double x:Key="BaseFontSize">12</sys:Double>
そうすれば、セッターでそれらを使用できます。
<Window>
には、FontSizeプロパティがあります。
そのため、そのウィンドウ内のすべての要素のフォントサイズを変更する場合は、要素に目的のフォントサイズを設定できます。
<Window FontSize="12">
</Window>
Application.Current.MainWindow.FontSize = _appBodyFontSize;
これにより、実行時にフォントサイズを変更することもできます。
TextElement.FontSize
は継承プロパティです。つまり、ルート要素でフォントサイズを設定するだけで、すべての子要素はそのサイズを使用します(手動で変更しない限り)
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" />
すべてのウィンドウに1回適用するために、静的(XAML)ではなく、グローバルにFontSizeをプログラムで変更する必要がある場合は、次のことができます。
TextElement.FontSizeProperty.OverrideMetadata(
typeof(TextElement),
new FrameworkPropertyMetadata(16.0));
TextBlock.FontSizeProperty.OverrideMetadata(
typeof(TextBlock),
new FrameworkPropertyMetadata(16.0));
この値は、TextBlock、Labels、およびウィンドウ内のほとんどすべてのテキストに適用されますが、明示的なFontSizeは定義されていません。ただし、これはTextBoxには影響しません。同様のコードを作成するか、他の特別なコントロールを作成する必要があります。
Ctrl-mousewheelでフォントサイズをグローバルに動的に変更するには:
XAML:
<Window Name="MainWindow" ... PreviewMouseWheel="MainWindow_PreviewMouseWheel">
コードビハインド:
private void MainWindow_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if ((Keyboard.Modifiers & ModifierKeys.Control) != 0)
{
if (e.Delta > 0)
++mainCtrl.FontSize;
if (e.Delta < 0 && mainCtrl.FontSize > 1)
--mainCtrl.FontSize;
}
}