Изменение размеров TextBox в Runtime в WPF

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

Спасибо :)

7
задан 14 May 2010 в 13:25
поделиться

2 ответа

ответ 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}" ... />

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

6
ответ дан 6 December 2019 в 21:11
поделиться

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

РЕДАКТИРОВАТЬ: Вот пример из реального приложения:

<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>
6
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: