wpf - 文本框与周围的网格一起扩展但不与文本一起扩展

标签 wpf xaml textbox autosize

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

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

这正是我想要的。但是,当用户开始键入文本时会出现问题。如果文本太长而无法在 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>

最佳答案

你可以使用一个不可见的边框(它很笨,但它有效 - 我倾向于在 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}" />

关于wpf - 文本框与周围的网格一起扩展但不与文本一起扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2591456/

相关文章:

c# - 无法在我的 WPF 网格中创建列

wpf - 有人知道 WPF 数据绑定(bind)示例的详尽集合吗?

c# - 如何访问 WPF Xaml 中的控件引用?

c# - 如何在 XAML 中为动态修改的 ObservableCollection 设置 DataContext

wpf - 使用带有多个绑定(bind)的 StringFormat 的 Multibinding 的较短 xaml 语法是什么?

vb.net - 如何在运行时更改列表框中的选定项文本?

c# - 在 C# 中构建数据模板

wpf - 组合框 selectionchanged 事件触发,甚至无需更改 ComboBox 中的选择

vb.net - 显示过去条目的文本框

c# - 如何在多行文本框中制作命令行