Окно имеет Сетку с двумя столбцами. Левый столбец содержит управление с постоянной шириной, но с высотой, которая адаптируется. Правый столбец содержит TextBox, который занимает все остающееся место в Сетке (и таким образом в Окне).
Сетке дают минимальную ширину и высоту и переносят в ScrollViewer. Если пользователь изменяет размер окна, чтобы быть меньшим, чем минимальная ширина/высота Сетки, полосы прокрутки отображены.
Это точно, как я хочу, чтобы это было. Однако проблема происходит, когда пользователь начинает вводить текст. Если текст долго для помещений в одну строку в TextBox, я хочу, чтобы текст перенесся. Поэтому я установил TextWrapping="Wrap"
на TextBox. Но так как TextBox имеет автоматическую ширину и перенесен в ScrollViewer (на самом деле целая Сетка, которая перенесена), 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>
Вы можете использовать невидимую рамку (это хитроумно, но работает - это то, как я стараюсь сортировать размеры динамических текстовых полей):
<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}" />
Вы пробовали установить свойство MaxWidth
только для TextBox?
Отредактируйте после комментария OP
Я бы попытался получить избавиться от ScrollViewer
. Размер, используемый в макете Grid
, должен учитывать изменение размера, а настройки полосы прокрутки в TextBox
должны позаботиться обо всем остальном.