【问题标题】:Resizing TextBox At Runtime in WPF在 WPF 中运行时调整文本框的大小
【发布时间】:2011-02-19 12:55:13
【问题描述】:

我只是想知道如何让用户在运行时通过在 WPF 中拖动它的角来调整 TextBox 控件的大小。不太重要的是,所有控件的大小调整都使用相同的技术吗?

谢谢你:)

【问题讨论】:

标签: c# .net wpf textbox resize


【解决方案1】:

您应该尝试将文本框的对齐方式设置为拉伸并将其放置在可以调整大小的容器中,例如带有网格分割器的网格(或可调整大小的窗口中)。这比尝试创建自定义的可调整大小的文本框要容易得多,并且它会更好地与您的布局的其余部分配合使用。

编辑: 下面是一个真实应用的示例:

<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
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2011-04-01
    • 2011-03-29
    相关资源
    最近更新 更多