只是想知道如何通过在WPF中拖动角来让用户在运行时调整TextBox控件的大小。不太重要的是,用于调整所有控件大小的技术是一样的吗?
谢谢:)
答案 0 :(得分:6)
您应该尝试将文本框的对齐设置为拉伸并将其放置在可以调整大小的容器中,例如带有栅格分割器的网格(或在可调整大小的窗口中)。这比尝试创建自定义可调整大小的文本框要容易得多,并且它可以更好地与其余布局配合使用。
编辑: 以下是来自真实应用的示例:
<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>
答案 1 :(得分:6)
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}" ... />
后一种方法的优点是你可以使用样式或附加属性来使TextBoxes可以调整大小,并且你可以在代码中动态地改变TextBox的可恢复性。