TextBox расширяется с помощью Grid, но не с текстом - PullRequest
11 голосов
/ 07 апреля 2010

У окна есть Сетка с двумя столбцами.Левый столбец содержит элемент управления с постоянной шириной, но с адаптируемой высотой.Правый столбец содержит TextBox, который занимает все оставшееся пространство в Grid (и, следовательно, в Window).

Grid имеет минимальную ширину и высоту и помещается в ScrollViewer.Если пользователь изменяет размер окна, чтобы он был меньше минимальной ширины / высоты сетки, отображаются полосы прокрутки.

Это именно то, как я хочу.Однако проблема возникает, когда пользователь начинает печатать текст.Если текст слишком длинный, чтобы поместиться в одну строку в TextBox, я хочу, чтобы текст был перенесен.Поэтому я установил TextWrapping="Wrap" в TextBox.Но так как TextBox имеет автоматическую ширину и обернут в ScrollViewer (это фактически вся Grid, который обернут), TextBox просто продолжает расширяться вправо.

Я хочу, чтобы TextBox расширялся, если окноразвернуто, но я не хочу, чтобы TextBox расширялся за счет текста.Скорее текст должен обернуться внутри доступного TextBox.Если текст не помещается в пределах высоты TextBox, в TextBox должна отображаться полоса прокрутки.

Есть ли способ сделать это?

Ниже приведен код, который показывает мою проблему:

<Window x:Class="AdaptingTextBoxes.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="400" Background="DarkCyan">
<Grid Margin="10" Name="LayoutRoot">
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid MinWidth="300" MinHeight="200">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button Grid.Column="0" Margin="0,0,10,0" Content="Button" Width="100" />

            <TextBox Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" />
        </Grid>
    </ScrollViewer>
</Grid>
</Window>

Ответы [ 3 ]

15 голосов
/ 07 апреля 2010

Вы могли бы использовать невидимую границу (это странно, но это работает - это то, как я склонен сортировать динамические размеры текстовых полей):

<Border BorderThickness="0" x:Name="border" Grid.Column="1" Margin="0.5" />
                <TextBox Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=border}" Height="{Binding ActualHeight, ElementName=border}" />
1 голос
/ 21 июня 2016

Ответ основан на ответе Леома.

Решение прекрасно работает, когда вы увеличиваете окно, но изменение размера происходит не плавно, когда вы уменьшаете окно. Поскольку текстовое поле участвует в макете сетки, оно должно выполнять процесс макета несколько раз. Это можно исправить, поместив текстовое поле на холст, чтобы изменение размера текстового поля больше не приводило к перестройке сетки.

Обновленный код:

<Border BorderThickness="0" x:Name="border" Grid.Column="1" Margin="0.5" />
<Canvas Grid.Column="1">
    <TextBox AcceptsReturn="True" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=border}" Height="{Binding ActualHeight, ElementName=border}" />
</Canvas>
1 голос
/ 07 апреля 2010

Вы пытались установить свойство MaxWidth только для TextBox?

Редактировать после комментария ОП

Я бы попробовал избавиться от ScrollViewer. Размер, используемый в макете Grid, должен изменить размер, а настройки полосы прокрутки в TextBox должны позаботиться об остальном.

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