在WPF中运行时调整文本框大小

8

我想知道如何在WPF中通过拖动角落来允许用户在运行时调整TextBox控件的大小。同样的技术是否用于所有控件的调整大小并不是很重要。

谢谢 :)


重复:https://dev59.com/mEfRa4cB1Zd3GeqP70kf - Heinzi
3
由于链接中的内容全部失效,因此这篇文章不应被标记为重复。 - anon271334
2个回答

8
你应该尝试将文本框的对齐方式设置为“拉伸”,并将其放置在一个可调整大小的容器中,例如带有网格分隔符的网格(或可调整大小的窗口)中。这比尝试创建自定义可调整大小的文本框要容易得多,并且可以更好地与您的布局结合使用。
编辑:以下是来自真实应用程序的示例:
<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>

这可能不完全适合您的情况,但这应该是您考虑的第一件事。 - Eric Mickelsen
有趣,我现在正在尝试! :-) +1 - anon271334

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}" ... />

后一种方法的优点是,您可以使用样式或附加属性使许多文本框具有可调整大小性,并且可以轻松地在代码中动态更改文本框的可调整大小性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接