Просто задавался вопросом, как я пойду о разрешении пользователю изменить размер управления TextBox во времени выполнения путем перетаскивания его углов в WPF. Менее значительно та же техника используется для изменения размеров всех средств управления?
Спасибо :)
ответ 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'а динамически в коде.
Вам следует попробовать настроить выравнивание текстового поля на растяжение и поместить его в контейнер, размер которого можно изменять, например сетку с разделителями сеток (или в окне с изменяемым размером). Это намного проще, чем пытаться создать настраиваемое текстовое поле с изменяемым размером, и оно будет лучше работать с остальной частью вашего макета.
РЕДАКТИРОВАТЬ: Вот пример из реального приложения:
<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>