none
Общий размер шрифта WPF

    Вопрос

  • Здравствуйте снова. Созрел такой вопрос. Как сделать в приложении регулируемый размер шрифта?

    Например выставили в глобальной переменной число 110, значит все масштабируется относительно этого числа. Изначально переменная  = 100. (100%) Уменьшая - соответственно уменьшается в нужной пропорции шрифт.

    Сейчас это у меня реализовано так. Все новые элементы, которые создаются, получают размеры через функцию ScaleSize("начальный размер"). Она возвращает размер относительно текущей переменной масштабирования.

    Это не совсем удобно, если элементы уже прописаны в XAML. Приходится каждый раз повторно при загрузке окна в коде выставлять размеры.

    Можно ли как-то использовать binding в xaml, для автоматического изменения размеров при изменении переменной? Вообще реально ли сделать привязку к функции или к значению переменной, которая находится в каком-либо классе или модуле?

Все ответы

  • Использовать привязки для шрифта, конечно же, можно (не к "функции" только, а к свойству). Что до размеров элементов, то подстраивать их в коде под размер шрифта нет необходимости, так как WPF умеет делать это автоматически. Вам нужно спроектировать макет окна без жесткого задавания размеров, и привязать свойство FontSize к вашему классу:

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        
            mc:Ignorable="d"
            x:Class="WpfApp1.MainWindow"
            Title="MainWindow" Height="400" Width="600" FontSize="{Binding Path=FontSize, Mode=TwoWay}">
    
        <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Label Content="Hello, World" HorizontalAlignment="Left"  VerticalAlignment="Top" Margin="10"
                   Background="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" FontFamily="Arial" FontWeight="Bold"  />
            <TextBlock HorizontalAlignment="Left"   TextWrapping="Wrap" Margin="10"
                       Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua" 
                       VerticalAlignment="Top" Width="289.076" 
                       Background="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}"/>
            <Button Content="Increase font size" HorizontalAlignment="Left"  Margin="10" 
                    VerticalAlignment="Top"  Click="Button_Click"/>
    
        </StackPanel>
    </Window>

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.ComponentModel;
    
    namespace WpfApp1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = Params.Instance;
                
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Params.Instance.FontSize++;
            }
        }
    
        public class Params:INotifyPropertyChanged
        {
            int _FontSize=12;
    
            public int FontSize
            {
                get
                {
                    return _FontSize;
                }
                set
                {
                    if (value != _FontSize)
                    {
                        _FontSize = value;
                        OnPropertyChanged("FontSize");
                    }
                }
            }
    
            Params()
            {
                
            }
    
            static Params _instance;
    
            void OnPropertyChanged(string prop)
            {
                PropertyChangedEventHandler h = PropertyChanged;
                if (h != null)
                {
                    h(this, new PropertyChangedEventArgs(prop));
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public static Params Instance
            {
                get {
                    if (_instance == null) _instance = new Params();
                    return _instance;
                }
            }
        }
    
        
    }