我所有的网格可能很小也可能很大,具体取决于窗口大小,但里面的文本在大网格大小上看起来非常小。
我目前的想法(但我还不知道如何实现)是将所有 Grid 元素绑定为单一字体,然后通过
override void OnRender(DrawingContext dc) {
取决于窗口大小。
问题是:这个想法是否合理,还有其他方法吗?
如果您没有明确设置内部元素的字体,它们会继承父字体。因此,您可以更改其中一个父元素(例如Window
自身或Grid
)的字体大小。这会更改所有未明确指定字体大小的内部元素的字体大小。
但是,如果您的字体应该具有不同的大小,我认为最好的解决方案是将元素的字体大小绑定到父窗口的字体大小,并使用值转换器对字体大小进行缩放:
像这样定义一个值转换器:
using System;
using System.Windows.Data;
namespace WPFTest
{
public class FontSizeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
double windowFontSize = (double)value;
var scale = System.Convert.ToDouble(parameter);
return windowFontSize * scale;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
并在您的 xaml 中使用它:
<Window x:Class="WPFTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:test="clr-namespace:WPFTest"
Title="Window1" Height="300" Width="300" FontSize="20" x:Name="window1">
<Window.Resources>
<test:FontSizeConverter x:Key="fontSizeConverter"/>
</Window.Resources>
<Grid>
<StackPanel Grid.Row="0" Grid.Column="0">
<TextBlock
FontSize="{Binding ElementName=window1, Path=FontSize, Converter={StaticResource ResourceKey=fontSizeConverter}, ConverterParameter=1.5}">
Text 1
</TextBlock>
<TextBlock FontSize="{Binding ElementName=window1, Path=FontSize, Converter={StaticResource ResourceKey=fontSizeConverter}, ConverterParameter=0.7}">
Text 2
</TextBlock>
<TextBlock >Text 3</TextBlock>
</StackPanel>
</Grid>
</Window>
ConverterParameter
用作与窗口相关的元素字体的比例(在ElementName
绑定的属性中指定)。
在此示例中,第一个字体TextBlock
是窗口字体的 150%,第二个字体是窗口字体的TextBlock
70%。第三个TextBlock
跟随窗口的字体大小。
我更喜欢 roberther 建议的这个解决方案。它更加简洁和干净。
<Viewbox>
<TextBlock Text="Hello World" />
</Viewbox>
我知道这是一篇旧帖子,但这是我搜索该主题时首先出现的内容之一,所以这是我的解决方案:
我最近在一个项目中完成了这项工作,用于处理文本框并相对于屏幕缩放其内容字体大小。为此,我设置了一个整数值并绑定了字体大小。
在我的例子中,我的屏幕高度从 800x650 开始,我希望我的字体默认大小为 12,因此我将整数值 (_ScaledFontSize) 设置为 WindowHeight/(650/12)。
每次屏幕大小改变时,都会调用一个函数来重新计算字体大小,并调用一个属性更改事件。在这个函数中,您可以使用简单的方法为最小和最大字体大小添加约束,例如:
//Set a minimum font size
if(_ScaledFontSize < 12)
_ScaledFontSize = 12;
为了强制执行此缩放大小,您想要缩放字体大小的每个控件都必须绑定到 ScaledFontSize 属性。
最后结果:
我一直在努力寻找这样的东西,最后这就是我的选择。幸运的是,代码非常简单: MainWindow.xaml.cs:
using System.Windows;
using System.ComponentModel;
namespace FontScaling
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
private int _ScaledFontSize;
public int ScaledFontSize
{
get => _ScaledFontSize;
set => _ScaledFontSize = value;
}
public void PropChange(string name)
{
System.ComponentModel.PropertyChangedEventArgs propertyChangedEvt = new System.ComponentModel.PropertyChangedEventArgs(name);
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, propertyChangedEvt);
}
}
public MainWindow()
{
InitializeComponent();
_ScaledFontSize = (int)Application.Current.MainWindow.Height / 54;
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
_ScaledFontSize = (int)Application.Current.MainWindow.ActualHeight / 54;
PropChange("ScaledFontSize");
}
}
}
MainWindow.xaml:
<Window x:Class="FontScaling.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FontScaling"
mc:Ignorable="d"
Title="MainWindow" Height="650" Width="800"
SizeChanged="Window_SizeChanged"
Name="_This">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="200*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="15*"/>
<ColumnDefinition Width="10*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="10*"/>
<ColumnDefinition Width="15*"/>
</Grid.ColumnDefinitions>
<TextBlock
VerticalAlignment="Bottom"
Grid.Row="1"
Grid.Column="1"
Text="Non Scaled TextBlock"/>
<TextBox
Grid.Row="2"
Grid.Column="1"
Text="Non Scaled Text"/>
<TextBlock
VerticalAlignment="Bottom"
Grid.Row="1"
Grid.Column="3"
Text="Scaled TextBlock"
FontSize="{Binding ScaledFontSize, ElementName=_This}"/>
<TextBox
Grid.Row="2"
Grid.Column="3"
Text="Scaled TextBox"
FontSize="{Binding ScaledFontSize, ElementName=_This}"/>
</Grid>
</Window>