在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>
浙公网安备 33010602011771号