Изменение размера TextBox во время выполнения в WPF - PullRequest
7 голосов
/ 14 мая 2010

Мне было просто интересно, как мне позволить пользователю изменить размер элемента управления TextBox во время выполнения, перетаскивая его углы в WPF. Менее важно, используется ли тот же метод для изменения размера всех элементов управления?

Спасибо:)

Ответы [ 2 ]

6 голосов
/ 14 мая 2010

Ответ tehMick абсолютно верен: вам определенно следует создать контейнер для изменения размера, а не настраивать сам TextBox. И если это работает для вас, GridSplitter - это очень хорошее встроенное решение.

У меня была такая же ситуация, но GridSplitter не работал, поэтому я создал элемент управления "ResizeBorder", который обрабатывал перетаскивание мышью по его четырем углам, чтобы изменить размер в двух измерениях, или середину сторон, чтобы изменить размер в одном. На самом деле это очень простой код: просто обработайте MouseDown, установите локальную переменную, указывающую местоположение MouseDown и перетаскиваемый край / угол, а затем на MouseMove обновите размер.

Мой ResizeBorder был пригоден для стилевого оформления, поэтому я мог показать только четыре прямоугольника по углам и линии по бокам или что-нибудь более сложное, что я мог придумать.

Кроме того, обратите внимание, что независимо от того, используете ли вы Grid и GridSplitters, ResizeBorder или что-то еще, у вас есть выбор размещения функции изменения размера либо вокруг элемента управления следующим образом:

<my:ResizeBorder ...>
  <TextBox ... />
</my:ResizeBorder>

или обновив ControlTemplate для самого TextBox:

<ControlTemplate x:Key="ResizableTextBox" TargetType="{x:Type TextBox}">
  <my:ResizeBorder>
    ...
  </my:ResizeBorder>
</ControlTemplate>

...

<TextBox Template="{StaticResource ResizableTextBoxTemplate}" ... />

Преимущества этого последнего метода в том, что вы можете использовать стиль или присоединенное свойство, чтобы сделать размер TextBoxes изменяемым, и что вы можете легко изменять изменяемый размер TextBox динамически в коде.

6 голосов
/ 14 мая 2010

Вы должны попытаться установить выравнивания текстового поля, чтобы растянуть и поместить его в контейнер, размер которого вы можете изменить, например, в сетку с сеточными сплиттерами (или в окне с изменяемым размером). Это гораздо проще, чем пытаться создать настраиваемое текстовое поле с изменяемым размером, и оно будет работать лучше с остальной частью вашего макета.

EDIT: Вот пример из реального приложения:

<Grid>...
<GridSplitter Grid.Row="1" Grid.ColumnSpan="2" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="4" BorderThickness="0,0,0,1" BorderBrush="Gray" Background="Transparent"/>
<TextBox Grid.Row="2" Grid.Column="0" Margin="6,6,6,6" Name="RequestTextBox" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" Text="{Binding Request, Mode=TwoWay}"/>
<GridSplitter Grid.Row="2" Grid.ColumnSpan="2" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="4" BorderThickness="0,0,0,1" BorderBrush="Gray" Background="Transparent"/>
...</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...