11

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

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

这正是我想要的样子。但是,当用户开始输入文本时会出现问题。如果文本太长而无法放入 TextBox 中的一行,我希望文本换行。因此,我TextWrapping="Wrap"在 TextBox 上进行了设置。但是由于 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>
4

3 回答 3

15

你可以使用一个不可见的边框(它很老套,但它可以工作——它是我倾向于在 Xaml 中整理动态文本框大小的方式):

<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}" />
于 2010-04-07T10:08:01.963 回答
1

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

OP评论后编辑

我会尝试摆脱ScrollViewer. 的布局中使用的大小Grid应该负责重新调整大小,而 上的滚动条设置TextBox应该负责其余的。

于 2010-04-07T10:08:51.267 回答
1

答案基于 Leom 的答案。

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

更新后的代码:

<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>
于 2016-06-21T10:49:21.923 回答