有没有更优雅的方法来自动调整标签字体大小?

时间:2019-02-15 15:42:45

标签: c# wpf resize

我有一个带有多个标签和其他控件的WPF UI。我希望标签内文本的大小与窗口大小成比例。

将标签放入Viewbox中是我想要的,但是我觉得将每个标签放入其自己的Viewbox中有点“不协调”。

<Viewbox Grid.Row="1">
    <Label>PA-Nummer</Label>
</Viewbox>

是否只有Xaml(与MVVM模式一起使用)方法才能更有效地做到这一点?

1 个答案:

答案 0 :(得分:-1)

如果要缩放整个内容(而不仅仅是文本),可以执行以下操作。假设您对Window(名为MyWindow)的顶级控制是Grid,那么这就是XAML:

<Window.Resources>
    <c:WindowWidthToScaleConverter x:Key="WindowWidthToScaleConverter" />
</Window.Resources>

<Grid>
    <Grid.LayoutTransform>
        <ScaleTransform
            ScaleX="{Binding ActualWidth, ElementName=MyWindow, Converter={StaticResource WindowWidthToScaleConverter}}"
            ScaleY="{Binding ActualWidth, ElementName=MyWindow, Converter={StaticResource WindowWidthToScaleConverter}}"
            />
    </Grid.LayoutTransform>
    <!-- Contents -->
</Grid>

这里是转换器,假定宽度为640是正常(1:1)比例:

public class WindowWidthToScaleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double width)
            return width / 640.0;
        return 1.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

更新:但是,上述解决方案只会使字体大小(和控件)出现更大,但实际上并不会改变字体大小。如果只想更改Label控件的字体大小,则可以在XAML中执行以下操作:

<Window.Resources>
    <c:WindowWidthToFontSizeConverter x:Key="WindowWidthToFontSizeConverter" />
    <Style TargetType="Label">
        <Setter
            Property="FontSize"
            Value="{Binding ActualWidth, ElementName=MyWindow,
                Converter={StaticResource WindowWidthToFontSizeConverter}}"
            />
    </Style>
</Window.Resources>

<StackPanel>
    <Label Content="Name:" />
    <TextBox />
</StackPanel>

转换器假定宽度640对应于字体大小12.0,并相应缩放:

public class WindowWidthToFontSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double width)
            return 12.0 * width / 640.0;
        return 12.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

您可以添加类似的Style资源以缩放其他控件的字体大小。但是,即使控件派生自Control类,您也无法通过这种方式为所有控件定义Style。但是,有一种解决方法here