我想知道如何在WPF中通过拖动角落来允许用户在运行时调整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>
tehMick的回答是绝对正确的:您应该创建一个容器来进行调整大小,而不是自定义TextBox本身。如果GridSplitter
适用于您,则是一个非常好的内置解决方案。
我遇到了同样的情况,但GridSplitter无法使用,因此我创建了一个“ResizeBorder”控件,它处理其四个角上的鼠标拖动以在两个维度上进行调整大小,或者在边缘的中间进行调整大小。这实际上是非常简单的代码:只需处理MouseDown,设置一个本地变量给出MouseDown位置和正在拖动的边/角,然后在MouseMove上更新大小。
我的ResizeBorder是可定制样式的,因此我可以仅显示四个角上的四个框和侧面的线条,或者任何更复杂的东西,只要我能想象得出。
此外,请注意,无论您是使用Grid和GridSplitters还是ResizeBorder或其他任何内容,您都可以选择将调整大小功能放置在控件周围,如下所示:或者:
<my:ResizeBorder ...>
<TextBox ... />
</my:ResizeBorder>
或者通过更新TextBox本身的ControlTemplate:
<ControlTemplate x:Key="ResizableTextBox" TargetType="{x:Type TextBox}">
<my:ResizeBorder>
...
</my:ResizeBorder>
</ControlTemplate>
...
<TextBox Template="{StaticResource ResizableTextBoxTemplate}" ... />
后一种方法的优点是,您可以使用样式或附加属性使许多文本框具有可调整大小性,并且可以轻松地在代码中动态更改文本框的可调整大小性。