Есть ли более элегантный способ автоматического изменения размера шрифта надписи? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть пользовательский интерфейс WPF с несколькими метками и другими элементами управления.Я хочу, чтобы размер текстов внутри меток масштабировался с размером окна.

Помещение метки в Viewbox делает то, что я хочу, но я чувствую, что помещать каждую метку в свой собственный Viewbox немного «неприлично»,

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

Существует ли подход, основанный только на Xaml (работа с шаблоном MVVM), чтобы сделать это более эффективно?

1 Ответ

0 голосов
/ 15 февраля 2019

Если вы хотите, чтобы все содержимое масштабировалось (не только текст), вы можете сделать что-то вроде следующего.Предполагая, что ваш верхний уровень управления вашим 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 для всех элементов управления таким образом.Тем не менее, есть обходной путь для этого объясненного здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...