2010-04-07 5 views
10

У меня есть проблема с TextBox в приложении ...WPF: TextBox расширения с окружающей сеткой, но не с текстом

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

Сетка имеет минимальную ширину и высоту и завернута в 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> 
+6

Сократите название на что-то значимое, мои глаза болят! –

+2

Священный вопрос в заголовке темы, Бэтмен! –

+1

Вы заработали самый длинный титульный значок :) –

ответ

13

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

<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}" /> 
+0

Я не могу заставить ваш код работать. Когда я увеличиваю окно, TextBox следует как следует, но когда я пытаюсь сделать окно меньше, TextBox не становится меньше (вместо этого отображаются полосы прокрутки scrollviewer). – haagel

+0

Приносим извинения - на границе нужна маржа - я не редактировал свой ответ. То, что я получаю за ответ от памяти - я проверил это, и он делает то, что вам нужно.Я уверен, что вы можете изменить поля и paddings в своем реальном приложении, чтобы маржа на границе стала частью приложения. –

+0

Большое спасибо Леом Берк! Это прекрасно работает! :) – haagel

1

Вы пробовали настройки MaxWidth собственности на просто TextBox ?

Edit после комментария OP в

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

+0

Я не хочу, чтобы TextBox имел максимальную ширину. Я хочу, чтобы он заполнил все оставшиеся места в Grid, как бы большой он ни был. – haagel

+0

@haagel - так почему горизонтальная полоса прокрутки на внешнем 'ScrollViewer'? Это всего лишь поощряет все, чтобы они расширялись горизонтально навсегда? Как вы уже видели, в TextBox есть полоса прокрутки. Я бы избавился от 'ScrollViewer'. –

+0

MaxWidth должен быть правильным, вы можете попробовать привязать MaxWidth к Grid.Width – Drake

1

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

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

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

<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> 

 Смежные вопросы

  • Нет связанных вопросов^_^