在WPF中如何根据窗口尺寸调整控件的字体大小

1,技术要求

1,项目中,控件的字体大小如textBlock, label,textbox等控件,其字体如果在声明的时候直接分配,则遇到分辨率低的屏幕,容易出现显示不全,影响美观。所以需要解决这个问题。
2,用到方法:实现IMultiValueConverter接口

2,准备工作

2.1 Visual Studio 2022 community
2.2 internet 连接

3,工作开始

3.1 创建工程

3.1.1 启动Visual 创建WPF程序,这里用的是.net 8,framework未验证

3.1.2 编辑创建FontConverter类并实现IMultiValueConverter接口,代码如下

点击查看代码
public class FontSizeConverter : IMultiValueConverter
{
    /// <summary>
    /// 改方法是将当前窗口的实际大小与设计时的大小进行比较,获取一个缩放因子,然后根据这个缩放因子来计算字体大小。
    /// </summary>
    /// <param name="values">binding的数值</param>
    /// <param name="targetType"></param>
    /// <param name="parameter"></param>
    /// <param name="culture"></param>
    /// <returns></returns>
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        double fontSize = 0;
        if (values.Length == 3)
        {
            double designSize = System.Convert.ToDouble(values[0]); // 设计时的字体大小
            double windowWidth = System.Convert.ToDouble(values[1]); // 当前窗口的宽度 设计宽度为1920
            double windowsHeight = System.Convert.ToDouble(values[2]); // 当前窗口的高度 设计高度为1080

            //由于在缩放时候,我这里将字体大小按照缩放的范围,进行
            double factor1= windowWidth / 1920.0; // 计算宽度缩放因子
            double factor2 = windowsHeight / 1080.0; // 计算高度缩放因子
            double factor = Math.Min(factor1, factor2); // 取宽度和高度缩放因子的最小值

            //下面开始计算字体大小

            return designSize*factor;

        }
        else
        {
            //直接返回字体大小为16.0
            return 16.0;
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3.1.3 App.xaml代码如下

点击查看代码
    <Application.Resources>
        <local:FontSizeConverter  x:Key="FontConverter"/>
        <Style TargetType="Button" x:Key="Button_F32">
            <Setter Property="HorizontalAlignment" Value="Stretch"/>
            <Setter Property="VerticalAlignment" Value="Stretch"/>
            <Setter Property="FontSize">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource FontConverter}" ConverterParameter="36.0">
                        <Binding Source="32.0"/>
                        <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType=Window}"/>
                        <Binding Path="ActualHeight" RelativeSource="{RelativeSource AncestorType=Window}"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>
    </Application.Resources>

3.1.4 MainWindow.xmal代码如下

点击查看代码
<Window
    x:Class="WpfApp1.MainWindow"
    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:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Width="1920"
    Height="1080"
    mc:Ignorable="d"
    Title="MainWindow">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Button Style="{StaticResource Button_F32}" Grid.Row="0" Grid.Column="0" Content="Button 1"/>
        <Button Style="{StaticResource Button_F32}" Grid.Row="0" Grid.Column="1" Content="Button 2"/>
        <Button Style="{StaticResource Button_F32}" Grid.Row="0" Grid.Column="2" Content="Button 3"/>
        <Button Style="{StaticResource Button_F32}" Grid.Row="0" Grid.Column="3" Content="Button 4"/>
        <Button Style="{StaticResource Button_F32}" Grid.Row="0" Grid.Column="4" Content="Button 5"/>
    </Grid>
</Window>

3.1.5 拖动边框,你就会发现字体随着窗口尺寸在自动变化

4 技术总结

4.1 建立继承于IMultiValueConverter接口的类,并实现Converter方法,按照自己的要求写出逻辑

4.2 创建资源文件,使字体绑定与Conveter

4.3 难点在于出个创建MultiBinding

posted @ 2025-06-27 20:49  采姑娘的小蘑菇Miya  阅读(160)  评论(0)    收藏  举报