WPF глобальный размер шрифта - PullRequest
63 голосов
/ 21 мая 2009

Я создаю приложение WPF и хотел бы узнать, как лучше всего изменить размер шрифта для каждого элемента пользовательского интерфейса. Создать ли словарь ресурсов и установить стили, чтобы задать размер шрифта для всех элементов управления, которые я использую?

Какая лучшая практика?

Ответы [ 9 ]

84 голосов
/ 21 мая 2009

Я бы сделал это так:

<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, вы также можете расширить базовый стиль, если создадите другие сеттеры внутри унаследованного стиля)

38 голосов
/ 13 августа 2010

FontSizeProperty наследуется от родительского контроля. Так что вам просто нужно изменить FontSize вашего главного окна.

Если вам не нужно динамическое поведение, это должно сработать:

Добавить стиль для Window в ваш ResourceDictionary

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

Применение стиля к основной форме (не будет применяться неявно, потому что это производный тип)

 Style = (Style)FindResource(typeof (Window));
25 голосов
/ 04 декабря 2010

Другим вариантом является определение FontFamily и FontSize в качестве ресурсов.

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

Таким образом, вы можете использовать их в своих сеттерах.

20 голосов
/ 06 июня 2014

<Window> имеет свойство FontSize.

Таким образом, вы можете установить желаемый размер шрифта в элементе, если вы хотите изменить размер шрифта во всех элементах этого окна.

<Window FontSize="12">

</Window>
8 голосов
/ 21 мая 2011
Application.Current.MainWindow.FontSize = _appBodyFontSize;

Таким образом, вы также можете изменить размер шрифта во время выполнения.

4 голосов
/ 16 июля 2011

TextElement.FontSize - это свойство наследования, что означает, что вы можете просто установить размер шрифта для корневого элемента, и все дочерние элементы будут использовать этот размер (если вы не измените их вручную)

3 голосов
/ 21 мая 2009

Для любых стилей в WPF у вас должен быть отдельный словарь ресурсов, содержащий стили для вашего приложения.

Если вы хотите использовать один размер шрифта, который повторно используется в приложении, просто создайте стиль для этого размера шрифта. Вы можете либо дать ему уникальное имя / ключ для явного использования, либо вы можете установить целевой тип, который будет распространяться по всему приложению.

Явный ключ:

<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 голос
/ 05 ноября 2018

Для динамического изменения размера шрифта глобально с помощью 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;
    }
}
1 голос
/ 10 ноября 2010

Если вам нужно программно изменить глобальный FontSize, а не статически (XAML), который будет применен один раз для всех ваших окон, вы можете сделать:

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

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

Эти значения применяются к любому текстовому блоку, меткам и почти к любому тексту в любых окнах, в то время как для него не определен явный FontSize. Но это не влияет на TextBox, вы должны написать аналогичный код для него или любых других специальных элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...