WPF глобальный размер шрифта
Я создаю приложение WPF и хотел бы узнать, как лучше всего изменить размер шрифта для каждого элемента пользовательского интерфейса. Создать ли словарь ресурсов и установить стили, чтобы установить размер шрифта для всех элементов управления, которые я использую?
Какова лучшая практика?
11 ответов
Я бы сделал это так:
<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 наследуется от родительского контроля. Так что вам просто нужно изменить FontSize вашего главного окна.
Если вам не нужно динамическое поведение, это должно сработать:
Добавьте стиль для Window в ваш ResourceDictionary
<Style TargetType="{x:Type Window}">
<Setter Property="FontSize" Value="15" />
</Style>
Примените стиль к основной форме (не будет применяться неявно, потому что это производный тип)
Style = (Style)FindResource(typeof (Window));
<Window>
имеет свойство FontSize.
Таким образом, вы можете установить желаемый размер шрифта в элементе, если вы хотите изменить размер шрифта во всех элементах в этом окне.
<Window FontSize="12">
</Window>
Другой вариант - определить FontFamily и FontSize в качестве ресурсов.
<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily>
<sys:Double x:Key="BaseFontSize">12</sys:Double>
Таким образом, вы можете использовать их в ваших сеттеров.
Application.Current.MainWindow.FontSize = _appBodyFontSize;
Таким образом, вы также можете изменить размер шрифта во время выполнения.
Для любых стилей в 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" />
TextElement.FontSize
является свойством наследования, что означает, что вы можете просто установить размер шрифта в корневом элементе, и все дочерние элементы будут использовать этот размер (если вы не измените их вручную)
Если вам нужно программно изменить глобальный FontSize, а не статически (XAML), чтобы он применялся один раз для всех ваших окон, вы можете сделать:
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;
}
}
Давайте немного ЧЕРНОЙ МАГИИ:
- Добавьте двойной ресурс в свой ресурс приложения.
<Application.Resources>
<sys:Double xmlns:sys="clr-namespace:System;assembly=mscorlib" x:Key="GlobalFontSize">12</sys:Double>
</Application.Resources>
- Добавьте статическое свойство в свой класс приложения.
public static double GlobalFontSize
{
get => (double)Current.Resources["GlobalFontSize"];
set => Current.Resources["GlobalFontSize"] = value;
}
- Используйте этот ресурс где угодно,
DynamicResource
FontSize="{DynamicResource GlobalFontSize}"
- Доступ к свойству
App.GlobalFontSize
каким-либо образом изменить значение,binding
хорошо!
App.GlobalFontSize = 20;
//Or
{Binding Path=(local:App.GlobalFontSize)}
Использование ресурсов в XAML - лучший способ. Хотя на этот вопрос есть много хороших ответов, я хотел бы добавить свои два цента к ОБЪЕМУ ресурса.
Для глобальной доступности во всех Windows и пользовательских элементах управления проекта вы можете разместить свой ресурс в файле App.xaml.
<Application.Resources>
<Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
<Setter Property="FontSize" Value="28"/>
</Style>
</Application.Resources>
Для обеспечения доступности на уровне окна вы можете иметь свой ресурс в файле xaml для Window
<Window.Resources>
<Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
<Setter Property="FontSize" Value="28"/>
</Style>
</Window.Resources>
Вы даже можете получить его на уровне управления, например
<DockPanel.Resources>
<Style TargetType="{x:Type Control}" x:Key="GlobalFontSize">
<Setter Property="FontSize" Value="28"/>
</Style>
</DockPanel.Resources>