Попытка изменить размер TextBox + размер шрифта в текстовом поле с помощью С# и WPF может сделать только одно или другое

Я пытаюсь изменить размер текстового поля и текста внутри текстового поля при изменении размера окна. Кажется, я могу сделать и то, и другое, но не то и другое сразу.

Изменение размера текстового поля работает, но я не могу изменить размер текста внутри: исходный размеризмененный размер

Код для приведенного выше примера:

    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="133*"/>
            <ColumnDefinition Width="20*"/>
            <ColumnDefinition Width="20*"/>
        </Grid.ColumnDefinitions>
        <Button Content="Button" Grid.Column="2"/>
        <Button Content="Button" Grid.Column="1"/>
        <TextBox TextWrapping="Wrap" VerticalContentAlignment="Center"/>
    </Grid>

Или изменение размера шрифта работает, но я не могу заставить текстовое поле заполнить окно просмотра, которое я использую: original< img src="https://i.stack.imgur.com/ys9Go.png" alt="изменен размер">

Код для приведенного выше примера:

    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="133*"/>
            <ColumnDefinition Width="20*"/>
            <ColumnDefinition Width="20*"/>
        </Grid.ColumnDefinitions>
        <Button Content="Button" Grid.Column="2"/>
        <Button Content="Button" Grid.Column="1"/>
        <Viewbox Stretch="Uniform">
            <TextBox TextWrapping="Wrap" VerticalContentAlignment="Center"/>
        </Viewbox>
    </Grid>

Использование Stretch="Fill" (правильно, но я бы предпочел сохранить единообразие, а UniformToFill делает что-то странное, и я даже не вижу, что происходит) Заполнить


person sdouble    schedule 17.10.2013    source источник


Ответы (2)


Вы можете использовать конвертер.

public class FontSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double actualHeight = System.Convert.ToDouble(value);
        int fontSize = (int)(actualHeight * .5);
        return fontSize;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

....
<Window.Resources>
    <local:FontSizeConverter x:Key="fontSizeCon" />
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="9*" />
        <RowDefinition Height="1*" />
    </Grid.RowDefinitions>     
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="133*"/>
            <ColumnDefinition Width="20*"/>
            <ColumnDefinition Width="20*"/>
        </Grid.ColumnDefinitions>
        <Button Content="Button" Grid.Column="2"/>
        <Button Content="Button" Grid.Column="1"/>
        <TextBox TextWrapping="Wrap" VerticalContentAlignment="Center"
                 FontSize="{Binding Path=ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}, Converter={StaticResource fontSizeCon}}"/>
    </Grid>      
</Grid>
...

Результат:

введите здесь описание изображения

введите здесь описание изображения

person kmatyaszek    schedule 17.10.2013
comment
Спасибо за это. Я все еще изучаю WPF, и мне пришлось кое-что посмотреть, чтобы даже увидеть, что вы здесь сделали. Я не только получил рабочее решение, но и узнал кое-что, исследуя это решение. - person sdouble; 18.10.2013
comment
Кроме того, просто хотел добавить, что мне потребовалось некоторое время, чтобы понять, потому что у меня нет привычки создавать проект перед запуском в среде IDE. Без построения он не видел пространство имен, просто к вашему сведению в дополнение к моему предыдущему комментарию. - person sdouble; 18.10.2013

Подойдет ли что-то подобное?

<Grid Grid.Row="1">
    <Grid.ColumnDefinitions>
            <ColumnDefinition Width="133*"/>
            <ColumnDefinition Width="20*"/>
            <ColumnDefinition Width="20*"/>
        </Grid.ColumnDefinitions>
        <Button Content="Button" Grid.Column="2"/>
        <Button Content="Button" Grid.Column="1"/>
        <Viewbox StretchDirection="Both" Stretch="Uniform">
            <TextBox Text="some text"></TextBox>
        </Viewbox>
    </Grid>
person Animus Miles-Militis    schedule 17.10.2013
comment
Это делает то же самое для меня, что и мой второй пример. - person sdouble; 18.10.2013