TextBox扩展与周围的网格,但不与文本

时间:2010-04-07 10:00:38

标签: wpf xaml textbox autosize

窗口有一个包含两列的Grid。左列包含一个具有恒定宽度但具有适应高度的控件。右列包含一个TextBox,它占用Grid中的所有剩余空间(从而占用Window)。

Grid的宽度和高度最小,并包含在ScrollViewer中。如果用户将窗口大小调整为小于网格的最小宽度/高度,则会显示滚动条。

这正是我想要的。但是,当用户开始键入文本时会出现问题。如果文本要长到适合TextBox中的一行,我希望文本换行。因此我在TextBox上设置了TextWrapping="Wrap"。但是由于TextBox具有自动宽度并且包含在ScrollViewer中(实际上是包裹的整个Grid),因此TextBox只是向右扩展。

如果窗口展开,我确实希望TextBox能够展开,但我不希望TextBox按文本展开。而是文本应该包装在可用的TextBox中。如果文本不适合TextBox高度,则应在TextBox中显示滚动条。

有没有办法实现这个目标?

下面是一些显示我的问题的代码:

<Window x:Class="AdaptingTextBoxes.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="400" Background="DarkCyan">
<Grid Margin="10" Name="LayoutRoot">
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid MinWidth="300" MinHeight="200">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button Grid.Column="0" Margin="0,0,10,0" Content="Button" Width="100" />

            <TextBox Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" />
        </Grid>
    </ScrollViewer>
</Grid>
</Window>

3 个答案:

答案 0 :(得分:15)

你可以使用一个不可见的边框(它的hacky但它​​的工作原理 - 我倾向于整理动态文本框大小):

<Border BorderThickness="0" x:Name="border" Grid.Column="1" Margin="0.5" />
                <TextBox Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=border}" Height="{Binding ActualHeight, ElementName=border}" />

答案 1 :(得分:1)

您是否尝试仅在TextBox上设置MaxWidth属性?

OP评论后编辑

我会尝试摆脱ScrollViewerGrid布局中使用的大小应该考虑重新调整大小,TextBox上的滚动条设置应该处理其余部分。

答案 2 :(得分:1)

答案是基于Leom的回答。

当您放大窗口时,解决方案很有效,但是当您缩小窗口时,调整大小并不平滑。由于文本框参与网格布局,因此必须多次执行布局处理。您可以通过将画布放在画布中来解决这个问题,因此文本框大小的更改不再触发网格的重新布局。

更新的代码:

<Border BorderThickness="0" x:Name="border" Grid.Column="1" Margin="0.5" />
<Canvas Grid.Column="1">
    <TextBox AcceptsReturn="True" TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=border}" Height="{Binding ActualHeight, ElementName=border}" />
</Canvas>